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

题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出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);
    }
    
}

 

 

发布了82 篇原创文章 · 获赞 22 · 访问量 2148
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 1024 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览