2012-03-12 170 views
-1

如何在二叉樹中遞歸執行插入操作,以便始終從左側填充?以下是我寫的代碼,這當然是錯誤的......我在遞歸有點弱...請提供您的建議...在二叉樹中插入

void insert(node **root,int n) 
{ 
    node *temp; 
    temp=(node *)malloc(sizeof(node)); 
    temp->data=n; 
    temp->lchild=NULL; 
    temp->rchild=NULL; 
    if(*root==NULL) 
    { 
     *root=temp; 
     return; 
    } 
    if((*root)->lchild==NULL) 
    { 
      (*root)->lchild=temp; 
      return; 
    } 
    if((*root)->rchild==NULL) 
    { 
      (*root)->rchild=temp; 
      return; 
    } 
    insert(&((*root)->lchild),n); 
    insert(&((*root)->rchild),n); 
    return; 
} 
+2

您需要知道樹中有多少元素才能平衡它 - 或者您將獲得一個列表(左 - >左 - >左 - >左等)。 – sje397 2012-03-12 14:56:13

+0

告訴我們樹是否應該平衡,完整或搜索二叉樹。它在插入策略上有所不同。 – Matteo 2012-03-12 15:12:55

+0

它只有一個二叉樹.....所以你需要在插入時跟蹤二叉樹的策略... – mmuttam 2012-03-12 16:01:40

回答

0
  1. 不要將返回值在C程序中的malloc
  2. 您的程序可能會插入n兩個子樹。
+0

有必要施加malloc的返回值,因爲malloc總是返回一個void指針...是的,它在兩個子樹中插入n ......我如何修改它? – mmuttam 2012-03-12 15:03:10

+0

**否**如果您有'#include'錯誤或者您正在使用C++編譯器,則只需要執行該操作。作爲或修復你的代碼,@ sje397在他上面的評論中有一個很好的建議。您需要決定在哪個子樹中插入新節點,而不是同時插入這兩個節點。 – 2012-03-12 15:11:40

0

嘗試迭代的方式。通過上面的用戶否則所建議的,你也會得到迭代的方式

public void insert(String data) 
{ 
    if(node == null) 
     node = new Node(null,data,null); 
    else 
    { 
     Queue<Node> q = new LinkedList<Node>(); 
     q.add(node); 
     while(q.peek() != null) 
     { 
      Node temp = q.remove(); 
      if(temp.left != null) 
       q.add(temp.left); 
      else 
      { 
       temp.left = new Node(null,data,null); 
       break; 
      } 

      if(temp.right != null) 
      { 
       q.add(temp.right); 
      } 
      else 
      { 
       temp.right = new Node(null,data,null); 
       break; 
      } 
     } 
    } 
} 

上面的代碼是Java像左>左列表>左等

如果西亞北非的做法。我想它很容易在C中實現。