BST使用前序遍历

时间:2012-09-26 01:28:34

标签: algorithm

是否可以构建二进制搜索树,只给出其前序遍历?

我知道只有在给定了inorder和preorder遍历的情况下才能构造二叉树。但我的问题是二元搜索树特有的。

例如:       鉴于:5,3,1,4,7,8

  Construct : 

       5
    3    7 
  1   4    8

4 个答案:

答案 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)

这里提供了更好的解释..

http://www.geeksforgeeks.org/archives/25203

答案 2 :(得分:1)

在构建树时,您正在使用数字的inorder属性。

  1. 根据特定的顺序和预订订定树。
  2. 如果仅给出了顺序,那么树的无限可能性。
  3. 同样,如果只给出预订,那么树的无限可能性。
  4. 前:

         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;
 }