剑指offer:二叉搜索树的后续遍历序列
Posted lj-lj
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer:二叉搜索树的后续遍历序列相关的知识,希望对你有一定的参考价值。
题目描述:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
解题思路:
根据二叉搜索的性质,后序遍历是先搜索左子树,再右子数,最后是根结点。对应到序列中就是,序列的最后一位为根结点,从头开始遍历序列中一段连续子序列小于根结点,为左子树,后一段连续子序列大于根结点,为右子树。
举个例子,序列为(2,4,3,6,7,5),则5为根结点,对应(2,4,3)都小于5,为左子树,(6,7)大于5,为右子树。再对每个子树递归。
注意,对于初试为空的序列,返回的结果应该是false。因此在递归过程中遇到空的子序列,需要多一个判断。或是重写一个递归函数,递归函数中的空序列返回true,而原函数中的空序列单独判断。
代码:
class Solution { public: bool VerifySquenceOfBST(vector<int> sequence) { if(sequence.size()==0) return false; if(sequence.size()==1) return true; vector<int> left; vector<int> right; int root = sequence[sequence.size()-1]; int i; for(i = 0; i<(sequence.size()-1); i++) { if(sequence[i]<root) left.push_back(sequence[i]); else break; } for(i = i+1; i<(sequence.size()-1); i++) { if(sequence[i]>root) right.push_back(sequence[i]); else return false; } if(left.size()==0 && right.size()==0) return true; if(left.size()==0 && VerifySquenceOfBST(right)) return true; if(right.size()==0 && VerifySquenceOfBST(left)) return true; if(VerifySquenceOfBST(left) && VerifySquenceOfBST(right)) return true; else return false; } };
以上是关于剑指offer:二叉搜索树的后续遍历序列的主要内容,如果未能解决你的问题,请参考以下文章