首页 > 其他分享 >【剑指Offer】23、二叉搜索树的后序遍历序列

【剑指Offer】23、二叉搜索树的后序遍历序列

时间:2023-08-14 23:44:34浏览次数:37  
标签:左子 结点 遍历 23 Offer 二叉 搜索 右子

【剑指Offer】23、二叉搜索树的后序遍历序列

题目描述:

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

解题思路:

对于后续遍历序列,序列的最后一个值一定是树的根结点,而由二叉搜索树的性质:左小右大,我们可以从头开始遍历,当遍历到某个值比根结点大时停止,记为flag,此时flag之前的所有数值都是二叉搜索树的左子树的结点,flag以及flag之后的所有数都是二叉搜索树的右子树的结点。这是由二叉搜索树以及后序遍历共同决定的。

接下来,我们就可以把任务交给递归,同样的方法去判断左子树和右子树是否是二叉搜索树,这显然是典型的递归解法。

举例

以{5,7,6,9,11,10,8}为例,后序遍历结果的最后一个数字8就是根结点的值。在这个数组中,前3个数字5、7和6都比8小,是值为8的结点的左子树结点;后3个数字9、11和10都比8大,是值为8的结点的右子树结点。

我们接下来用同样的方法确定与数组每一部分对应的子树的结构。这其实就是一个递归的过程。对于序列5、7、6,最后一个数字6是左子树的根结点的值。数字5比6小,是值为6的结点的左子结点,而7则是它的右子结点。同样,在序列9、11、10中,最后一个数字10是右子树的根结点,数字9比10小,是值为10的结点的左子结点,而11则是它的右子结点,所以它对应的二叉搜索树如下:

编程实现(Java):

public class Solution {
    public boolean VerifySquenceOfBST(int [] sequence) {
        if(sequence==null||sequence.length==0)
            return false;
        return VerifySquenceOfBST(sequence,0,sequence.length-1);
    }
    public boolean VerifySquenceOfBST(int [] sequence,int begin,int end){
        if(end<=begin) //结束条件
            return true;
        //end为根节点,找左右子树的分界
        int i=begin;
        for(;i<end;i++) //找边界,并同时判断了左子树都小于根
            if(sequence[i]>sequence[end])
                break;
        for(int j=i+1;j<end;j++) //右子树如果存在小于根的,则不是二叉搜索树
            if(sequence[j]<sequence[end])
                return false;
        return VerifySquenceOfBST(sequence,begin,i-1) && VerifySquenceOfBST(sequence,i,end-1);
    }
}

标签:左子,结点,遍历,23,Offer,二叉,搜索,右子
From: https://www.cnblogs.com/bujidao1128/p/17630092.html

相关文章

  • 2023.8.14
    今天上午把留下来的作业写完了,真的超级开心!有种解脱的感觉!!!真的太爽啦!明天就可以好好出去玩啦!正好和别人约了一起去玩!但是不开心的就是。。马上要开学了,真的很sad!所以趁着这几天再好好玩一下吧游戏里总算拿了一次第一!七夕要为人准备礼物啦,第一次有过这个节,忐忑加激动无论如......
  • 20230813 arm64 汇编学习 helloworld.s
    Programming with64-Bit ARMAssembly Language SingleBoardComputerDevelopment forRaspberryPiandMobileDevices —StephenSmith 32bitsARM64指令:////Assemblyprogramtoprint"helloworld"tostdout////x0-x2parameterstolinuxfunct......
  • 2023知网答题
    最终得分 真题如下:搜索即可 一、单选题1、片面追求研究成果发表的优先权,不负责任地发表明显不成熟的成果。这一行为属于()抢先发表拆分发表一稿多投重复发表您的答案:A 参考答案:A收藏答案解析:片面追求研究成果发表的优先权,不负责任地发表明显不成熟的成果,或......
  • 2023NepCTF-RE部分题解
    2023NepCTF-RE部分题解九龙拉棺过反调试很容易发现void__stdcallsub_401700()里面有tea的痕迹接出来发现只是前半部分#include<stdio.h>#include<stdint.h>#include"defs.h"#include<stdio.h>#include<stdio.h>#include<stdint.h>//加密函数......
  • 2023牛客暑期多校训练营9--I Non-Puzzle: Segment Pair
    思路:直接枚举区间左端点,用一个cnt数组表示当前端点l,r或者L,R存在1个还是2个或者0个。用一个sum变量记录有多少段区间覆盖了该端点,如果sum==n那么这个端点就有了贡献。更详细的看代码注释。#include<bits/stdc++.h>usingnamespacestd;#defineIOSios::sync_with_stdio(fa......
  • 2023-08-14 CSP-J模拟联考 游记
    8:00 赶到 FZ,9:00正式开考。开考前先洗了一把脸。9:00~9:15开T1,原本没有思路,但后来想到可以贪心,每次找到<n 的最大的斐波那契数。于是打了个斐波那契的表,就过了。9:15~10:00T2写了45分钟我是什么东西。一开始想法是把每一个字符的数量统计起来,如果相差<1就满足要求,否......
  • 20230814巴蜀暑期集训测试总结
    T2考场一直卡在二进制思路里面,最后打了一个\(O(n\max\{a_i\})\)的方法,居然忘了继续向后跑\(\log\)位,挂掉\(20pts\)(像这种情况全挂也是有可能的)。我认为其实有的时候不要随便简化问题,或者说想多了也要及时回来(虽然这可能很不容易)。自己认为的简化不一定就把题目变简单了。像......
  • 【愚公系列】2023年08月 WPF控件专题 XAML介绍
    (文章目录)<hrstyle="border:solid;width:100px;height:1px;"color=#000000size=1">前言WPF(WindowsPresentationFoundation)是微软推出的一种基于.net框架的图形用户界面技术,它使用XAML(eXtensibleApplicationMarkupLanguage)作为UI的描述语言。XAML是一种基于XML的标记......
  • [代码随想录]Day17-二叉树part06
    题目:654.最大二叉树思路:和前中序构造树差不多的方法,以前是返回值,现在是返回树代码:/***Definitionforabinarytreenode.*typeTreeNodestruct{*Valint*Left*TreeNode*Right*TreeNode*}*/funcconstructMaximumBinaryTree(nums[]in......
  • 剑指 Offer 36. 二叉搜索树与双向链表(中等)
    题目:classSolution{public:Node*head=nullptr;Node*pre=nullptr;voidtraversal(Node*cur){//二叉搜索树中序遍历的顺序就是构建双向链表的顺序if(!cur)return;traversal(cur->left);if(pre){//若前置节点存在,则与当......