码迷,mamicode.com
首页 > 其他好文 > 详细

Verify Preorder/Inorder/Postorder Sequence in Binary Search Tree

时间:2016-08-05 06:34:51      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:

Verify Preorder Sequence in Binary Search Tree

\Given an array of numbers, verify whether it is the correct preorder traversal sequence of a binary search tree.

You may assume each number in the sequence is unique.

Follow up: Could you do it using only constant space complexity?

分析:http://my.oschina.net/u/922297/blog/498356

先复习一下BST,给定一个节点,其左子树的所有节点都小于该节点,右子树的所有节点都大于该节点;preorder序列是指在遍历该BST的时候,先记录根节点,再遍历左子树,然后遍历右子树;所以一个preorder序列有这样一个特点,左子树的序列必定都在右子树的序列之前;并且左子树的序列必定都小于根节点,右子树的序列都大于根节点;

根据上面的特点很容易通过递归的方式完成:

  1. 如果序列只有一个或者两个元素,那么肯定是正确的;

  2. 如果多于两个个元素,以当前节点为根节点;并从当前节点向后遍历,直到大于根节点的节点出现(或者到尾巴),那么根节点之后,大于根节点的节点之前的,是左子树;大于根节点的节点及之后的组成右子树;递归判断左右子树即可;

  3. 那么什么时候一个序列肯定不是一个preorder序列呢?前面得到的右子树,如果在其中出现了比根节点还小的数,那么就可以直接返回false了。

public boolean verifyPreorder(int[] seq, int start, int end) {
        if (start + 1 >= end)
            return true;

        int root = seq[start];
        int i = start + 1;
        while (i <= end && seq[i] < root) {
            i++;
        }

        if (i < end) {
            int j = i;
            while (j <= end && seq[j] > root) {
                j++;
            }
            if (j < end) {
                return false;
            }

            return verifyPreorder(seq, start + 1, i - 1) && verifyPreorder(seq, i, end);
        } else {
            return verifyPreorder(seq, start + 1, end);
        }
    }

Verify Inorder Sequence in Binary Search Tree

判断array是否递增。

Verify Postorder Sequence in Binary Search Tree

判断postorder和上面判断preorder是一模一样的,最后一个是root,然后从头到尾扫,如果当前的值大于root,则判断左边和右边部分是否是BST, 并且判断右边所有的值都大于root。

 1 public boolean verifyPostorder(int[] preorder) {
 2         return verifyPostorder(preorder, 0, preorder.length - 1);
 3     }
 4 
 5     public boolean verifyPostorder(int[] seq, int start, int end) {
 6         if (start + 1 >= end)
 7             return true;
 8 
 9         int root = seq[end];
10         int i = start;
11         while (i <= end - 1 && seq[i] < root) {
12             i++;
13         }
14         if (i < end - 1) {
15             int j = i;
16             while (j <= end - 1 && seq[j] > root) {
17                 j++;
18             }
19             if (j < end - 1) {
20                 return false;
21             }
22 
23             return verifyPostorder(seq, start, i - 1) && verifyPostorder(seq, i, end - 1);
24         } else {
25             return verifyPostorder(seq, start, end - 1);
26         }
27     }

 

Verify Preorder/Inorder/Postorder Sequence in Binary Search Tree

标签:

原文地址:http://www.cnblogs.com/beiyeqingteng/p/5739748.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!