是否可以构建二进制搜索树,只给出其前序遍历?
我知道只有在给定了inorder和preorder遍历的情况下才能构造二叉树。但我的问题是二元搜索树特有的。
例如: 鉴于:5,3,1,4,7,8
Construct :
5
3 7
1 4 8
答案 0 :(得分:11)
是的,您可以从预订遍历构建二叉搜索树。给定预先遍历a_1,...,a_n,将其划分为三个段a_1,(a_2,...,a_k)和(a_ {k + 1},..,a_n),其属性为a_ {k + 1}是预订中第一个大于a_1的元素。
递归计算(a_2 {k + 1},..,a_n)的(a_2,...,a_k)和BST T2的BST T1,并将它们添加为新BST的左右子树根在a_1。
答案 1 :(得分:1)
这里提供了更好的解释..
答案 2 :(得分:1)
在构建树时,您正在使用数字的inorder属性。
前:
a a
/ \ \
b e and b
/ \ / \ \
d c f g d
\
c
\
e
\
f
\
g
以上两种树都有相同的预订顺序,即a,b,d,c,e,f,g
这是因为我们没有考虑给定元素之间的任何排序作为你给出的数字。
如果您在使用BST时需要订购,此链接提供解决方案。
http://www.geeksforgeeks.org/construct-bst-from-given-preorder-traversa/
答案 3 :(得分:0)
基于上述算法..我在c ++中的实现
node* buildtree(int[] preOrder,int start,int end) {
if(start>end) return NULL;
node *t = malloc(sizeof(node));
// finds the index of the first element greater than preOrder[start]
int index = find_index(preOrder, preOrder[start], start+1, end);
t->left = buildtree(preOrder,start+1,index-1);
t->right = buildtree(preOrder,index,end);
return t;
}
int find_index(int[] preOrder, int search_element, int start, int end) {
for(int i=start;i<=end;i++) {
if(preOrder[i]>search_element) return i;
}
return end+1;
}