[英]Inorder tree traversal in binary tree in C
在下面的代碼中,我正在使用插入函數創建一個二叉樹,並嘗試使用遵循有序遍歷邏輯的有序函數顯示插入的元素。當我運行它時,會插入數字,但是當我嘗試有序遍歷時功能(輸入3),程序繼續進行下一個輸入而不顯示任何內容。 我猜可能存在邏輯錯誤。請幫助我清除該錯誤。 提前致謝...
#include<stdio.h>
#include<stdlib.h>
int i;
typedef struct ll
{
int data;
struct ll *left;
struct ll *right;
} node;
node *root1=NULL; // the root node
void insert(node *root,int n)
{
if(root==NULL) //for the first(root) node
{
root=(node *)malloc(sizeof(node));
root->data=n;
root->right=NULL;
root->left=NULL;
}
else
{
if(n<(root->data))
{
root->left=(node *)malloc(sizeof(node));
insert(root->left,n);
}
else if(n>(root->data))
{
root->right=(node *)malloc(sizeof(node));
insert(root->right,n);
}
else
{
root->data=n;
}
}
}
void inorder(node *root)
{
if(root!=NULL)
{
inorder(root->left);
printf("%d ",root->data);
inorder(root->right);
}
}
main()
{
int n,choice=1;
while(choice!=0)
{
printf("Enter choice--- 1 for insert, 3 for inorder and 0 for exit\n");
scanf("%d",&choice);
switch(choice)
{
case 1:
printf("Enter number to be inserted\n");
scanf("%d",&n);
insert(root1,n);
break;
case 3:
inorder(root1);
break;
default:
break;
}
}
}
您的insert
接受一個指向node
的指針,該指針在函數范圍內是本地的。 insert
返回后,被調用的根保持不變。 而且您會泄漏。
如果你想改變insert
並成為它的外部可見,通過改變其簽名啟動
void insert(node **root,int n)
並這樣稱呼它:
void insert(&root1, n);
這樣,它將修改root1
而不是其副本。
根據經驗,如果函數需要修改某些內容,則應將其傳遞給它的指針。 您的函數需要修改一個node*
,因此應將其傳遞給一個node**
。
編輯
正如unwind指出的那樣,您還可以返回根作為更新根的一種方式
root1 = insert(root1, n);
當然,這僅在需要修改一個對象時才有效。
您的分配代碼已關閉,因為malloc結果僅分配給局部變量,所以root1
將始終保持NULL
。 將root傳遞為指針。
另外,即使左右可能已經有數據,您也可以無條件地左右分配malloc,您應該立即調用insert並讓被調用的insert處理malloc就像root一樣。 再次用指針當然是指針。
最后,您else root->data = n
沒有任何意義,已經是n。 我想您不想在樹上重復嗎? 如果需要,則需要更改代碼。
將node *
引用傳遞給insert()
以便在分配新節點時對其進行適當更新。
另外,在您的insert()
函數中,不要移入下面的樹中。 如果分配,則您的代碼將嘗試檢查該節點上的值,然后再次進行操作,這是不正確的。
更新的代碼將是:
void insert(node **root_ptr,int n)
{
if(root==NULL) //for the first(root) node
{
root=(node *)malloc(sizeof(node));
root->data=n;
root->right=NULL;
root->left=NULL;
*root_ptr = root;
}
else
{
if(n<(root->data))
{
//root->left=(node *)malloc(sizeof(node));
insert(&root->left,n);
}
else if(n>(root->data))
{
//root->right=(node *)malloc(sizeof(node));
insert(&root->right,n);
}
else
{
root->data=n;
}
}
}
從main()
調用它為insert(&root1,n);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.