回答
您從根遍歷二叉樹:
- 如果你的新元素是小於或大於當前節點平等的,你去左子樹,否則的右子樹,並繼續遍歷
,如果你到了一個節點,在那裏你不能去任何更深,因爲沒有樹,這是插入新元素的地方
(5)Root (3)-------^--------(7) (2)---^----(5) ^-----(8) (5)--^
您從(5)
開始,然後向左(因爲5 < = 5)變爲(3)
,然後右轉(從5> 3)到(5)
,然後您想要轉到左子樹(因爲5 < = 5),但是你會發現沒有子樹,所以這裏是插入新元素(5)
的地方。
Plz算法將爲我做... – 2010-04-25 16:35:57
所以OP確實說它是一個二叉樹,你已經提供了一個或多或少的二叉搜索樹的答案,雖然你不會允許添加一個重複的5到二進制搜索樹 – 2015-10-31 20:30:55
這取決於你是否要保留您的二叉樹:
- 分類
- 平衡
如果這些都不是要求再添加元素的最快方法是把它作爲新的根,有樹的其餘部分都有它的一個孩子:
(5)
(5)----^
(3)-------^--------(7)
(2)---^----(5) ^-----(8)
對於二分搜索樹,您不應該有重複的值,並且插入過程更加複雜,並且需要遍歷樹來查找插入點。請參閱here。
對於自平衡二叉搜索樹,它更加複雜,例如可能涉及執行tree rotations。有關更多詳細信息,請參閱here。
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;
}
}
}
/// <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;
}
}
- 1. 如何添加一個節點在二叉搜索樹
- 2. 如何正確添加二叉搜索樹中的節點?
- 3. 添加到二叉樹C++
- 4. 在二叉樹中交叉的節點
- 5. 將節點添加到二叉搜索樹C++
- 6. 我的二叉樹是否正確添加節點?
- 7. 添加新節點時維護平衡二叉樹的算法
- 8. 將節點添加到二叉搜索樹
- 9. 將節點添加到二叉搜索樹
- 10. 插入節點二叉樹
- 11. Prolog。二叉樹的節點
- 12. 二叉樹節點計數
- 13. 將節點添加到二叉搜索樹隨機刪除節點
- 14. 如何在二叉樹中找到節點的父節點?
- 15. 加入二叉樹
- 16. 在二叉樹中計算節點
- 17. 在二叉樹中交換節點
- 18. 在二叉樹的葉節點的
- 19. 插入/添加二叉樹的方法
- 20. 二叉搜索樹遞歸添加
- 21. 將數據添加到二叉樹
- 22. 添加整數二叉樹F#
- 23. 添加並生成二叉查找樹
- 24. 僅添加到根的二叉樹
- 25. 添加一行到二叉樹
- 26. C++:使用加倍節點複製二叉樹
- 27. 向樹添加節點
- 28. 將節點添加到樹
- 29. 如何在二叉搜索樹中迭代添加元素?
- 30. 如何查找並返回二叉樹的最底部(最深節點)節點?二叉搜索樹?
您需要提供更多的信息..例如編程語言和你到目前爲止。 – 2010-04-25 16:27:11
你是如何添加其他'5'的? – 2010-04-25 16:29:02
實際上,如果它是二叉搜索樹,那麼它是錯誤的。 – 2010-04-25 16:30:10