《剑指offer》—— 二叉搜索树的后续遍历序列(Java)

久未见 提交于 2020-01-15 09:39:12

题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

public class Solution {
    public boolean VerifySquenceOfBST(int [] sequence) {
        
    }
}

 

思路:

先回顾了解一下二叉搜索树:

二叉搜索树(Binary Search Tree),(又:二叉查找树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树
列如:

我们写一下上面这个二叉搜索树的后续遍历(左右根):

2,5,3,8,7,6 

根据后续遍历规则以及二叉搜索树的规则,我们可以知道:

  1. 最后一个元素是根节点;
  2. 比最后一个元素大的,是树的右子树的元素;比最后一个树小的,是树的左子树的元素;

综上,我们可以将树划分成  [2,5,3]  [8,7]  [6]

其中 [6]是根结点,  [2,5,3] 是左子树的后续遍历, [8,7] 是右子树的后续遍历。

我们可以将划分出来的 左子树 和 右子树 再继续按照上述方法划分;

一直到将元素划分完,划分过程中,如果没有违反二叉搜索树的规则,就说明改后续遍历是某二叉搜索树的后续遍历。

 

实现:

public class Solution {
    public boolean VerifySquenceOfBST(int [] sequence) {
        if (sequence == null || sequence.length == 0)
            return false;
        return check(sequence,0,sequence.length - 1);
    }
    
    private boolean check(int[] sequence, int first, int last){
        if (last - first <= 1)
            return true;
        int rootVal = sequence[last];
        int cutIndex = first;
        while (cutIndex < last && sequence[cutIndex] <= rootVal)
            cutIndex++;
        for (int i = cutIndex; i < last; i ++)
            if (sequence[i] < rootVal)
                return false;
        return check(sequence,first,cutIndex - 1) && check(sequence,cutIndex,last -1);
    }
    
}

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!