(5)Root (3)-------^--------(7) (2)---^----(5) ^-----(8)
我想在此二进制搜索树中添加包含数据5的节点。请帮忙。
答案 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;
}
}