2012-03-12 117 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中实现。