判断是否为二叉搜索树的后序遍历序列

简介: 二叉树相关练习

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


题目链接:二叉搜索树的后序遍历序列_牛客题霸_牛客网


知识点:

二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树


二叉排序树或者是一棵空树,或者是具有下列性质的二叉树

(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;

(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;

(3)左、右子树也分别为二叉排序树;

(4)没有键值相等的节点。


而且这里题目也强调了第四点,任意两个数字都不同,也就是没有键值相等的点。


分析:


已知条件:后序序列最后一个值为root;二叉搜索树左子树值都比root小,右子树值都比root大。

1、确定root;

2、遍历序列(除去root结点),找到第一个大于root的位置,则该位置左边为左子树,右边为右子树;

3、遍历右子树,若发现有小于root的值,则直接返回false;(不用再去遍历左子树确认是否有大于root的值,因为上一步找到第一个大于root值的位置的时候,就已经确认了左边一定全部小于root)

4、分别判断左子树和右子树是否仍是二叉搜索树(即递归步骤1、2、3)。


AC代码:

publicclassSolution {
publicbooleanVerifySquenceOfBST(int [] sequence) {
if (sequence==null||sequence.length==0)    returnfalse;
returnVertify1(sequence, 0, sequence.length-1);
    }
privatebooleanVertify1(int[] a, intstart, intend) {
if (start>=end)    returntrue; // 截止条件可用[4,6,7,5]数据测试inti=start;
while (a[i] <a[end]) {
++i;
        }
for (intj=i; j<end; ++j) {
if (a[j] <a[end])    returnfalse;
        }
returnVertify1(a, start, i-1) &&Vertify1(a, i, end-1);
    }
}

image.gif


================Talk is cheap, show me the code===================

目录
相关文章
|
6月前
|
Java C++ 索引
leetcode-106:从中序与后序遍历序列构造二叉树
leetcode-106:从中序与后序遍历序列构造二叉树
50 0
【LeetCode】105. 从前序与中序遍历序列构造二叉树
题目描述: 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 示例:
61 0
|
1月前
|
存储 索引 Python
从中序与后序遍历序列构造二叉树
【10月更文挑战第13天】这段内容介绍了一种基于中序和后序遍历序列构建二叉树的方法。通过识别后序遍历中的根节点,并利用中序遍历划分左右子树,进而递归构建整棵树。文中提供了具体示例及Python代码实现,并分析了该方法的时间与空间复杂度。
|
1月前
输入二叉树先序序列,输出先序,中序,后序序列
输入二叉树先序序列,输出先序,中序,后序序列
16 0
21_从中序与后序遍历序列构造二叉树
21_从中序与后序遍历序列构造二叉树
|
6月前
|
C++ 索引 Python
leetcode-105:从前序与中序遍历序列构造二叉树
leetcode-105:从前序与中序遍历序列构造二叉树
46 0
|
11月前
|
C++ 索引
从前序与中序遍历序列构造二叉树(C++实现)
从前序与中序遍历序列构造二叉树(C++实现)
92 1
|
11月前
|
C++ 索引
从中序与后序遍历序列构造二叉树(C++实现)
从中序与后序遍历序列构造二叉树(C++实现)
73 1
【LeetCode】-- 105. 从前序与中序遍历序列构造二叉树
【LeetCode】-- 105. 从前序与中序遍历序列构造二叉树
135 0
【LeetCode】-- 105. 从前序与中序遍历序列构造二叉树