剑指offer——二叉搜索树的后续遍历序列
2016-07-29 11:01
399 查看
题目描述:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路:
此题仍然是对二叉树遍历方法的考察,但是与直接对遍历方法的考察不太一样,因为这里的输入是后续遍历的序列,所以要判断该序列是否是某二叉树的后续遍历结果,关键在于找出根节点,根节点的左子树和根节点的右子树,然后继续对左子树和右子树进行判断,直到全部元素访问完毕。这里很显然是一个递归的过程。由于后续遍历是先访问双亲节点,接着访问左孩子,再访问右孩子,所以需要对每个节点的左右子树做进一步的判断。代码实现:
public class Solution { public boolean VerifySquenceOfBST(int [] sequence) { if(sequence.length <= 0) return false; int rootVal = sequence[sequence.length - 1]; int i = 0; for(; i < sequence.length - 1; i++){ if(sequence[i] > rootVal) break; } //拷贝左子树到一个新的数组 int[] leftTree = new int[i]; //五个参数分别是: //第一个是要复制的数组,第二个是从要复制的数组的第几个开始, //第三个是复制到哪,四个是复制到的数组第几个开始,最后一个是复制长度 System.arraycopy(sequence, 0, leftTree, 0, i); int j = i; //判断后半部分是否有小于根节点的值 for(; j < sequence.length - 1; j++){ if(sequence[j] < rootVal) return false; } //拷贝右子树到一个新数组 int[] rightTree = new int[sequence.length - i - 1]; System.arraycopy(sequence, i, rightTree, 0, sequence.length - i - 1); boolean verifyLeft = true; if(i > 0){ verifyLeft = VerifySquenceOfBST(leftTree); } boolean verifyRight = true; if(i < sequence.length - 1){ verifyRight = VerifySquenceOfBST(rightTree); } return verifyLeft && verifyRight; } }
相关文章推荐
- 剑指offer-二叉搜索树的后续遍历序列
- 剑指offer面试题 二叉搜索树的后续遍历序列
- 剑指offer——二叉搜索树的后续遍历序列
- 剑指Offer--二叉搜索树的后续遍历序列
- 剑指offer 4.3 举例形象化问题4-二叉搜索树的后续遍历序列
- 剑指offer-题24:二叉搜索树的后续遍历序列
- 剑指offer 面试题24 判断二叉搜索树后续遍历序列
- [剑指Offer]二叉搜索树的后续遍历序列
- 剑指offer:二叉搜索树的后序遍历序列(判断一个数组是否是二叉搜索树的后续遍历序列)
- 剑指offer 二叉搜索树后续遍历序列 判断
- 剑指Offer之 - 二叉搜索树的后续遍历序列
- 【剑指Offer】面试题24:二叉搜索树的后续遍历序列
- 【剑指Offer面试题】 九度OJ1367:二叉搜索树的后序遍历序列
- 【剑指offer】4.3举例让抽象问题具体化——面试题24:二叉搜索树的后序遍历序列
- 剑指offer--二叉搜索树的后序遍历序列
- 剑指offer—二叉搜索树的后序遍历序列
- 剑指offer面试题24:二叉搜索树的后序遍历序列
- 剑指offer-二叉搜索树的后续遍历
- 剑指offer 23 二叉搜索树的后序遍历序列
- 剑指offer 二叉树的后续遍历序列