剑指Offer-20——二叉搜索树的后续遍历

题目描述

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

思路解析

  1. 首先需要了解树这个数据结构,这里双手奉上我写的:关于树的数据结构博客

  2. 这里先直接介绍:后序遍历
    在这里插入图片描述

  3. 题中的数并非是普通的二叉树,而是特殊的二叉搜索树,二叉搜索树的特点:

  • (1)每个节点有一个唯一的key值,且所有结点互不相同;
  • (2)左子树所有key值小于根的key值;
  • (3)右子树所有key值大于根的key值;
  • (4)左右子树都是二叉搜索树。
  1. 因此,这里可以考虑根据其特性进行解答。
  2. 下图是一个二叉搜索树:
    在这里插入图片描述
    后序遍历的序列是:1,2,4,3,6,9,8,7,5。
    由后序遍历可知,根结点是5,由此来区分左右子树。
    遍历数组:
    左子树的数据为:1,2,4,3
    右子树的数据为:6,9,8,7
    然后在来区分左子树的各子树和叶子节点
    3为根结点,1,2,4。为其子孙结点。其中1,2为左子树结点,4为右子树结点。
    然后分1,2可知,1,2中,2为根节点,1为左叶子结点。
    右子树同理。
    在这个过程可以很方便的进行子树的分割,即最后一个结点为根结点。,然后在分割左右子树。
    在代码过程中就递归的分割左右子树,同时在分割的时候进行判断,根结点应该大于所有左子树节点,小于所有有子树结点。

代码

public class Solution {
    public boolean VerifySquenceOfBST(int [] sequence){
        //注意java中为空的情况可以是null也可以是[]
        if(sequence.length==0||sequence==null) return false;
        return isBST(sequence,0,sequence.length-1);
    }
    public boolean isBST(int[] sequence,int start,int end){
        //当只有一个元素和根节点的时候,就直接返回正确
        if(start>=end) return true;
        //当多个节点的时候先将最后一个节点取出 因为后序遍历最后一个节点就是根节点
        int root = sequence[end];
        //切分左右节点的下标
        int Index = start;
        //找到根节点的位置
        for(; Index<end;Index++){
            if(sequence[Index]>root)
                break;
        }
        //将根节点的元素与前面的进行对比
        for(int i=start;i<Index;i++){
            if(sequence[i]>=root){
                return false;
            }
        }
        //将根节点与后面的比较
        for(int j= Index;j<end;j++){
            if(sequence[j]<root)
                return false;
        }
        //将左右子树送去进行递归
        return isBST(sequence,start,Index-1)&&isBST(sequence,Index,end-1);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值