我認為用于遍歷包含節點值的陣列的索引變數應該是一個全域變數,但 C 不允許我這樣做。左節點作業正常,但右節點也顯示與左節點相同的值。在包含值的陣列中,-1 表示一個空節點,我使用預排序 (root->left->right) 來構建樹:

#include<stdio.h>
#include<stdlib.h>
typedef struct no{
int data;
struct no * left;
struct no * right;
}node;
node* building_node(int);
node* building_binary_tree(int*,int,node*);
int main()
{
system("clear||cls");
int a[]={4,2,9,-1,-1,8,-1,-1,7,-1,-1};
node*root=NULL;
root=building_binary_tree(a, -1,root);
printf("The Binary Tree Has:\n\n");
printf("root = %d \n",root->data);
printf("root->left = %d \n",root->left->data);
printf("root->right = %d \n",root->right->data);
// printf("%d ",root->left->left->data);
// printf("%d ",root->left->right->data);
}
node * building_node(int data)
{
//for building an empty node with data
node* newnode=(node*)calloc(1,sizeof(node));
newnode->data=data;
newnode->right=NULL;
newnode->left=NULL;
return newnode;
}
node* building_binary_tree(int* a,int index,node* root)
{
//for building the tree recursively
index ;
if(a[index]==-1) return NULL;
root=building_node(a[index]);
root->left=building_binary_tree(a,index,root->left);
root->right=building_binary_tree(a,index,root->right);
return root;
}
uj5u.com熱心網友回復:
根節點的簽名build_tree()與其余節點的簽名不同是很正常的build_subtree()。在這種情況下,我們希望隱藏有關如何在陣列中前進的實作細節。
你可以index像以前一樣使用,但你需要告訴對方你能走多遠。這意味著指向您的索引 ( *index) 的指標。我選擇將指標的地址傳遞給陣列本身(**a)。然后我們只構建當前節點并遞回構建左右子樹。
作為獎勵(為了便于除錯),我添加了一個print_tree(),這樣我們就可以檢查整個樹,而不僅僅是根,它是 2 個孩子。
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node *left;
struct node *right;
} node;
node * build_node(int data) {
node* n = malloc(sizeof *n);
n->data = data;
n->right = NULL;
n->left = NULL;
return n;
}
node *build_subtree(int **a) {
if(**a == -1) return NULL;
node *n = build_node(**a);
(*a) ;
n->left = build_subtree(a);
(*a) ;
n->right = build_subtree(a);
return n;
}
node *build_tree(int *a) {
return build_subtree(&a);
}
void print_subtree(node *n, size_t level) {
if(!n) return;
level ;
print_subtree(n->right, level);
for(int i = 0; i < 3 * (level - 1); i )
printf("%c", ' ');
printf("%d <\n", n->data);
print_subtree(n->left, level);
}
void print_tree(node *n) {
print_subtree(n, 0);
}
int main() {
node *root = build_tree(
(int []) {4, 2, 9, -1, -1, 8, -1, -1, 7, -1, -1}
);
print_tree(root);
}
并且輸出是(您的圖片逆時針旋轉 90 度):
7 <
4 <
8 <
2 <
9 <
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/515662.html
標籤:C指针递归链表二叉树
