博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[剑指offer] 23. 二叉搜索树的后序遍历序列
阅读量:4656 次
发布时间:2019-06-09

本文共 1285 字,大约阅读时间需要 4 分钟。

题目描述

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

思路:
解法一:递归
二叉搜索树,后序遍历的数组中,最后一位是根节点,保存根节点。
除根节点外,数组中分为两部分,前一部分全部小于根节点,为左子树,另一部分全部大于根节点,为右子树。
分别找出两部分的范围,对两个子树进行递归判断是否是后序遍历序列。
class Solution{public:  bool VerifySquenceOfBST(vector
sequence) { if (sequence.empty()) return false; return helper(sequence, 0, sequence.size() - 1); } bool helper(vector
seq, int beg, int end) { if (beg >=end) return true; int root = seq[end]; int i = beg; while (seq[i] < root) { i++; } int j = i; while (j < end) { if (seq[j] < root) { return false; } j++; } return helper(seq, beg, i - 1) && helper(seq, i, end - 1); }};

解法二:非递归

同样的,去除数组最后一个值,也就是根,数组分为左右子树两部分。

此时数组最右边的值是右子树的根节点,大于所有左子树的值。同时,右子树部分中,所有右子树元素都大于该值。

于是判断右子树是否符合条件即可。

class Solution{public:  bool VerifySquenceOfBST(vector
sequence) { int j = sequence.size(); if (j == 0) return false; int i = 0; while (--j) { while (sequence[i++] < sequence[j]) ; while (sequence[i++] > sequence[j]) ; if (i < j) return false; i = 0; } return true; }};

 


 

 

转载于:https://www.cnblogs.com/ruoh3kou/p/10066732.html

你可能感兴趣的文章
xpath
查看>>
Ubuntu12安装RobotFramework
查看>>
hdu 1269 迷宫城堡 强连通图 tarjan
查看>>
inner join和outer join
查看>>
补码与符号位取反
查看>>
生日。金鼎轩吃饭;亿旺中影看《后会无期》。
查看>>
[蓝桥杯] 排它平方数
查看>>
jmeter学习记录--03--jmeter负载与监听
查看>>
Altium Designer 复制和粘贴功能
查看>>
zynq基础-->LINUX 设备树
查看>>
C++友元函数、友元类
查看>>
Linux基本操作指令
查看>>
用TypeScript开发Vue——如何通过vue实例化对象访问实际ViewModel对象
查看>>
图解二叉树遍历(递归调用)
查看>>
IIS 应用程序池 已停用
查看>>
==还款-代偿(csv循环自动代偿)
查看>>
BZOJ 2402 陶陶的难题II (01分数规划+树剖+线段树+凸包+二分)
查看>>
升级openssh踩得坑
查看>>
【openCV】openCV2.4.8在vs2010旗舰版中的配置
查看>>
继承小结
查看>>