标签:
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序列有这样一个特点,左子树的序列必定都在右子树的序列之前;并且左子树的序列必定都小于根节点,右子树的序列都大于根节点;
根据上面的特点很容易通过递归的方式完成:
如果序列只有一个或者两个元素,那么肯定是正确的;
如果多于两个个元素,以当前节点为根节点;并从当前节点向后遍历,直到大于根节点的节点出现(或者到尾巴),那么根节点之后,大于根节点的节点之前的,是左子树;大于根节点的节点及之后的组成右子树;递归判断左右子树即可;
那么什么时候一个序列肯定不是一个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