二叉搜索树的后序遍历序列

来源:牛客网 《剑指offer》

题目描述

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

先复习一下二叉搜索树(来自维基百科):

二叉查找树(英语:Binary Search Tree),也称二叉搜索树、有序二叉树(英语:ordered binary tree),排序二叉树(英语:sorted binary tree),是指一棵空树或者具有下列性质的二叉树

  1. 任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  2. 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  3. 任意节点的左、右子树也分别为二叉查找树;
  4. 没有键值相等的节点。

后序遍历是先访问左子树,然后右子树,最后根节点。

下图的后序遍历序列为:4,6,7,5,12,20,15,10.

因此思路是,先遍历序列,与根节点比较,将序列分为左子树和右子树,其中左子树的值都必须<根节点,右子树的值都必须>根节点。递归上述过程。

思路不难,但是我写了好长时间,主要是一些边界条件没注意。

AC代码:

 1 public class TT {
 2     static int time=0;
 3
 4     public static void main(String[] args) {
 5         int[] a={4,6,7,5,12,20,15,10};
 6         // int[] a={5,4,3,2,1};
 7
 8         System.out.println(VerifySquenceOfBST(a));
 9     }
10
11
12     public static boolean VerifySquenceOfBST(int [] sequence) {
13         //if(sequence==null) return false;
14         if(sequence.length==0) return false;
15         return Core(sequence, 0, sequence.length-1);
16     }
17
18     public static boolean Core(int[] a, int start, int end){
19         //if(start==end) return true;
20         if(start>=end) return true;
21
22         int mid=getMid(a, start, end);
23         System.out.println(start+" "+end+" "+mid);
24         for(int i=start; i<= mid; ++i)
25             if(a[i]>a[end]) return false;
26         for(int i=mid+1; i<= end-1; ++i)
27             if(a[i]<a[end]) return false;
28
29         return (Core(a, start, mid) && Core(a, mid+1, end-1));
30     }
31
32     // 4 6 7 5 | 12 20 15 10
33     // root=10
34     public static int getMid(int[] a, int start, int end){
35         for(int i=start; i<=end; ++i){
36             if(a[i]>a[end]) {
37                 // if(i==start) return start; // left subtree is null
38                 // else return i-1;
39                 return i-1; // if left subtree is null, i.e. i=0, return value is -1
40             }
41         }
42
43         return end-1; // if the right subtree is null
44     }
45 }

碰到的细节问题有:

(1)数组==null 与 长度为0并不一样

//if(sequence==null) return false;
if(sequence.length==0) return false;

int[] a={};
a 的长度为0,但a!=null。

(2)边界条件

//if(start==end) return true;
if(start>=end) return true;
for 循环初始化语句i=start;而不是i=0;
43行处return end-1,而不是 a.length-1.

(3) getMid 函数用于将序列分为左子树和右子树,返回左子树的最后一个节点的索引。

当左子树为空时,应该返回-1. 而我一开始的代码返回0. (上述代码中已注释掉)。

时间: 2024-10-26 15:14:48

二叉搜索树的后序遍历序列的相关文章

二叉搜索树的后序遍历序列-剑指Offer

二叉搜索树的后序遍历序列 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 思路 后序遍历:左-->右-->根节点 二叉搜索树中,左子树的节点小于根节点,右子树的节点大于根节点 递归调用,根据大小区别左右子树,若在右子树中发现小于根节点的节点,就不是后续遍历序列 举一反三:如果要求处理一棵二叉树的遍历序列,我们可以先找到二叉树的根节点,再基于根节点把整棵树的遍历序列拆分成左子树对应的子序列和右子

二叉树的层次遍历(队列) and 二叉搜索树的后序遍历序列

(一)从上往下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印.[层次遍历] 从上到下打印二叉树的规律:每一次打印一个节点的时候,如果该节点有子节点,则把该节点的子节点放到一个队列的末尾.接下来到队列的头部取出最早进入队列的节点,重复前面的操作,直至队列中所有的节点都被打印出来为止. //二叉树的层次遍历#include<iostream>#include<queue>using namespace std; typedef int ElemType;typedef st

剑指offer之【二叉搜索树的后序遍历序列】

题目: 二叉搜索树的后序遍历序列 链接: https://www.nowcoder.com/practice/a861533d45854474ac791d90e447bafd?tpId=13&tqId=11176&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入

判断一个数组是否是二叉搜索树的后序遍历序列 24

引言 ? ? 继续二叉树,这个题考的知识点是二叉树的后续遍历 ? ? 分析问题 ? ? 对于一个二叉树的后序遍历序列来说,最后一个数一定是根节点,然后前面的数中,从最开始到第一个大于根节点的数都是左子树中的数,而后面到倒数第二个数应该都是大于根节点的,是右子树,如果后面的数中有小于根节点的,那么说明这个序列不是二叉搜索树的后序遍历序列 ? ? 解决问题 ? ? 同样是用递归去做,首先要考虑Corner Case,如果array为空,那么返回false ? ? 然后找到根节点,根节点是array最

剑指offer系列源码-二叉搜索树的后序遍历序列

题目1367:二叉搜索树的后序遍历序列 时间限制:1 秒内存限制:32 兆特殊判题:否提交:1359解决:684 题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 输入: 每个测试案例包括2行: 第一行为1个整数n(1<=n<=10000),表示数组的长度. 第二行包含n个整数,表示这个数组,数组中的数的范围是[0,100000000]. 输出: 对应每个测试案例,如果输入数组是某二叉搜索树的

剑指offer-第四章解决面试题思路(判断一个数组是否为二叉搜索树的后序遍历序列)

二叉搜索树:二叉搜索树根节点的左边都比根节点小,右边都比根节点大. 例题:输入一个数组,判断是否为二叉搜索树的后序遍历序列,如果是,返回true,如果不是,返回flase,假设没有重复的元素. 思路:由于是后序遍历,所以数组的最后一个节点是根节点,而且,由于是二叉收索树,所以,前面的数据被分为两部分,右边部分比根节点小,左边比根节点大.左右两边又分别为二叉收索树,因此可以用递归来实现. Java代码: public class IsBinarySearchTree { public boolea

剑指Offer对答如流系列 - 二叉搜索树的后序遍历序列

面试题33:二叉搜索树的后序遍历序列 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入的数组的任意两个数字都互不相同. 例如,输入数组{5.7.6.9.11.10.8},则返回true,因为这个整数序列是下图二叉搜索树的后序遍历结果. 如果输入的数组是{7.4.6.5},则由于没有哪棵二叉搜索树的后序遍历是这个序列,因此返回false. 问题分析 后序遍历 遍历顺序是 :左子树 -> 右子树 -> 根结点(最后遍历根节

剑指offer(五十九)之二叉搜索树的后序遍历序列

题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 思路分析:BST的后序序列的合法序列是,对于一个序列S,最后一个元素是x (也就是根),如果去掉最后一个元素的序列为T,那么T满足:T可以分成两段,前一段(左子树)小于x,后一段(右子树)大于x,且这两段(子树)都是合法的后序序列. public class Solution { public boolean VerifySquenceOfBST(

二叉搜索树的后序遍历序列——24

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入数组的任意两个数组都互不相同. 二叉搜索树的特点就是每个结点的左子树的值都比自身的值小,而右子树的值都比自身值要大.比如如上的二叉搜索树后序遍历的结果就是{5,7,6,9,11,10,8},但是题意并不是给出一棵二叉搜索树让判断数组是否为后序遍历序列,而是只有一组数据让判断是否为某个二叉搜索树的后序遍历结果,因此之能依据二叉搜索树后序遍历结果的特点来进行分析判断: 就拿上面的结果来说