先序和中序遍历的二叉树
如何从这些前/中顺序遍历中获取树:
Pre: A,B,D,E,C,F,G,H 在:E,D,B,A,G,F,H,C
编辑:我的答案
A
/ \
B C
/ \
D F
/ / \
E G H
How can I get the tree form these pre/in order traversal:
Pre: A,B,D,E,C,F,G,H
in:E,D,B,A,G,F,H,C
EDITED: MY Answer
A
/ \
B C
/ \
D F
/ / \
E G H
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
编辑:
更正,
您没有正确的答案,FGH 在 C 的左侧。
要验证,只需针对它运行两个算法:
您知道 A 是根,因为它启动了预序。使用中序将节点排列在 A 的左侧和右侧。B 是第二个节点(前序),A 的左侧(中序),依此类推。
你知道 F,G,H 是 C 的左边,因为按顺序排列。
基本上,使用预序来选择下一个节点,并按序查看它是在父节点的左侧还是右侧。
编辑(2011 年 4 月 18 日):
为了展示这个过程的机械性,我提供了这个伪代码:
技巧是使用有序序列来确定节点是否添加到它的父级,例如:
我正在传递一个lambda,但任何传递比较器的等效方法都应该这样做。
EDIT:
Correction,
You don't have the correct answer, FGH is to the left of C.
To verify just run the two algorithms against it:
You know that A is the root because it starts the pre-order. Use the in-order to arrange nodes to the left and right of A. B is the second node (pre-order), and left of A (in-order), and so on.
You know that F,G,H is left of C because of the in-order arrangement.
Basically, use preorder to select the next node, and in-order to see whether it is left or right of the parent node.
EDIT (18 Apr 2011):
To show how mechanical the process is I offer this pseudo code:
The trick is to use the in-order sequence to determine whether a node is added to the left or right of its parent, for example:
I'm passing a lamba, but any equivalent method for passing a comparer should do.
这是一种以非常简单的方式实现这一目标的数学方法:
使用的语言:Java
`
/*
从给定的中序和先序遍历构造二叉树的算法。
以下是使用的术语:
i :表示提供的中序数组
p :表示提供的前序数组
beg1 :中序数组的起始索引
beg2 :前序数组的起始索引
end1 :中序数组的结束索引
end2 :前序数组的结束索引
*/
public static void ConstructionTree(Node root, int[] i, int[] p, int beg1, int end1, int beg2, int end2)
{
}
`
您需要通过以下代码调用该函数:
如果您需要更详细的解释代码请在评论中提及。我很乐意提供帮助:)。
Here is a mathematical approach to achieve the thing in a very simplistic way :
Language Used : Java
`
/*
Algorithm for constructing binary tree from given Inorder and Preorder traversals.
Following is the terminology used :
i : represents the inorder array supplied
p : represents the preorder array supplied
beg1 : starting index of inorder array
beg2 : starting index of preorder array
end1 : ending index of inorder array
end2 : ending index of preorder array
*/
public static void constructTree(Node root, int[] i, int[] p, int beg1, int end1, int beg2, int end2)
{
}
`
You need invoke the function by following code :
In case you need a more elaborate explanation of code please mention it in the comments. I would be happy to help :).
下面是 C# 中的一个工作实现
这是
BinarySearchTree
和BinaryTreeNode
的一种可能实现T>
。一些测试:
Below is a working implementation in C#
Here is one possible implementation of
BinarySearchTree<T>
andBinaryTreeNode<T>
. Some tests: