如何在二叉树中添加添加节点

时间:2010-04-25 16:25:11

标签: tree binary-tree

                   (5)Root
          (3)-------^--------(7)
     (2)---^----(5)           ^-----(8)

我想在此二进制搜索树中添加包含数据5的节点。请帮忙。

4 个答案:

答案 0 :(得分:3)

您从根遍历二叉树:

  • 如果您的新元素小于或等于当前节点,则转到左子树,否则转到右子树并继续遍历
  • 如果你到达了一个节点,你不能再深入了,因为没有子树,这就是插入新元素的地方

                   (5)Root
          (3)-------^--------(7)
     (2)---^----(5)           ^-----(8)
            (5)--^
    

您从(5)开始,然后向左(从5 <= 5开始)到(3),然后向右(从5&gt; 3开始)到(5),然后你想要转到左子树(因为5 <= 5),但是你看到没有子树,所以这是插入新元素(5)的地方。

答案 1 :(得分:2)

这取决于您是否要保留二叉树:

  • 排序
  • 平衡

如果这些都不是要求,那么添加元素的最快方法是将其作为新根,并使树的其余部分具有其子项之一:

                         (5)
                   (5)----^
          (3)-------^--------(7)
     (2)---^----(5)           ^-----(8)

对于二叉搜索树,您不应该有重复的值,并且插入过程更复杂,并且需要遍历树以查找插入点。请参阅here

对于自平衡二进制搜索树,它甚至更复杂,例如可以涉及执行tree rotations。有关详细信息,请参阅here

答案 2 :(得分:1)

private void Insert(Node node, ref Node tree)
{    
        if (tree == null)                          // Found a leaf?    
        {                                      
             tree = node;                          // Found it! Add the new node as the new leaf.
        }    
        else    
        {        
             int val = string.Compare(node.Key, tree.Key);        // already inserted        
             if (val == 0)
             {            
                  throw new InvalidOperationException("Duplicate key");
             }        
             elseif (val < 0)        
             {            
                  Node left = tree.Left;            
                  Insert(node, ref left);              // Keep moving down the left side.            
                  tree.Left = left;        
             }        
             else        
             {            
                  Node right = tree.Right;         
                  Insert(node, ref right);            // Keep moving down the right side.            
                  tree.Right = right;        
             }    
      }
}

答案 3 :(得分:1)

/// <summary>
    /// Construct the tree from a pre order traversal
    /// </summary>
    /// <param name="preorderTraversal"></param>
    /// <returns></returns>
    public static TreeNode ConstructTreeFromPreOrderTraversal(int[] preorderTraversal)
    {

        if (null == preorderTraversal || preorderTraversal.Length < 1)
            return null;
        TreeNode root = null;
        int len = preorderTraversal.Length;
        for (int i = 0; i < len; i++)
        {
            TreeNode newNode = new TreeNode();
            newNode.Data = preorderTraversal[i];
            newNode.Left = newNode.Right = null;
            AddNode(ref root, newNode);
        }
        return root;
    }

    /// <summary>
    /// add not in the tree
    /// </summary>
    /// <param name="root"></param>
    /// <param name="newNode"></param>
    private static void AddNode(ref TreeNode root, TreeNode newNode)
    {
        if (root == null)
            root = newNode;
        else if (newNode.Data < root.Data)
        {
            TreeNode left = root.Left;
            AddNode(ref left, newNode);
            root.Left = left;
        }
        else
        {
            TreeNode right = root.Right;
            AddNode(ref right, newNode);
            root.Right = right;
        }
    }