33_剑指offer_java_二叉搜索树的后序遍历序列

本文介绍了一种算法,用于判断给定数组是否为二叉搜索树的后序遍历结果。通过递归检查子树结构,确保左子树小于根,右子树大于根,最终确定整个序列是否符合二叉搜索树特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

题目描述

测试用例

解题思路

参考解题

举一反三


题目描述

输入整数数组,判断该数组是不是某个二叉搜索树的后序遍历结果。是,返回true;不是,false。

假设输入的数组任意两个数字互不相同。

 

测试用例

  • 功能测试(输入的后序遍历序列对应一颗二叉树,包括完全二叉树、所有节点都没有左/右子树的二叉树、只有一个节点的二叉树;输入的后序遍历没有对应的一颗二叉树)
  • 特殊输入测试(指向后序遍历序列的指针为空指针)

 

解题思路

1、后序遍历基本结构为:左(比根小)------右(比根大)-------

2、在后序遍历序列中,检查数组中每一个子树是否满足1中的结构,这是一个递归过程;

3、所有都满足返回true,有一个不满足返回false。

 

参考解题

package Sword;

import java.util.Arrays;

/**
 * 二叉搜索树的后序遍历序列
 * @author tyler
 *
 */

public class Solution{
    public boolean VerifySquenceOfBST(int [] sequence) {
        // 异常
        if(sequence == null || sequence.length <= 0){
            return false;
        }
        
        // 调用功能函数
        return VerifyCore(sequence, sequence.length);
    }
     
    //--------功能函数,形参改变--------------------------------
        public boolean VerifyCore(int[] sequence, int length){
        // 异常
        if(sequence == null || length <= 0){
            return false;
        }
        // 根
        int root = sequence[length-1];
        
        // 找出左子树部分,在二叉搜索树中左子树节点值小于根节点
        int i = 0;
        for(;i < length-1;++i){
            if(sequence[i] > root)
                break; // 此时的i为右子树部分第一个元素下标
        }
        // 判断右子树部分是否满足:右子树节点值大于根节点
        int j = i;
        for(;j < length-1;++j ){
            if(sequence[j] < root)
                return false; // 此时右子树部分节点必须全部大于根节点,否则不是二叉树搜索树
        }
        // 递归判断左子树是否为二叉搜索树
        boolean left = true;
        if(i > 0){
            left = VerifyCore(sequence, i);
        	}
         // 右
         boolean right = true;
         if(i < length - 1){
             right = VerifyCore(Arrays.copyOfRange(sequence, i, length - 1),length - i - 1);
         	}
         return (left && right);
        }
}

 

举一反三

面對二叉树的遍历序列,先找到二叉树的根节点,再根据遍历特点将序列拆分为左右子树序列,然后递归处理这两个子序列。

基本结构:

1、前序遍历:根 ------- 左(比根小)------ 右(比根大);

2、中序遍历:左(比根小)------- 根 ------右(比根大);

3、后序遍历:左(比根小)------ 右(比根大)-------

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值