簡體   English   中英

C中二叉樹中的有序樹遍歷

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM