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

题目描述

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

题解一:递归

后序遍历序列的最后一个元素为二叉树的根节点;

二叉搜索树左子树上所有的结点均小于根结点、右子树所有的结点均大于根

 1  public static boolean VerifySquenceOfBST(int [] sequence) {
 2         if(sequence.length==0){
 3             return false;
 4         }
 5         if(sequence.length==1){
 6             return true;
 7         }
 8         return judge(sequence,0,sequence.length-1);
 9     }
10     public static boolean judge(int[] arr,int start,int end ) {
11         if (start >= end) {
12             return true;
13         }
14         int i = start;
15         //找到左右支树临界点,即右支树的第一个节点索引为i
16         while (arr[i] < arr[end]) {
17             i++;
18         }
19         //若右支树节点小于根节点,则false
20         for (int j = i; j < end; j++) {
21             if (arr[j] < arr[end]) {
22                 return false;
23             }
24         }
25         //左右支树均符合才true
26         return judge(arr, 0, i - 1) && judge(arr, i, end - 1);
27     }
题解二:栈的压入、弹出序列

讨论区大佬写这道题的例子时发现二叉树的中序序列和后序序列就满足栈的压入弹出序列关系。即如果把中序序列当做栈的压入序列,那么后序序列是该栈的一个弹出序列。 而BST的中序是排序数组。因此将本题的序列排序作为中序序列,引用“栈的压入、弹出序列”题的答案判断两序列是否满足上述关系即可

 1 public static boolean VerifySquenceOfBST01(int [] sequence) {
 2         int[] arr = sequence.clone();
 3         Arrays.sort(arr);
 4         return IsPopOrder(arr,sequence);
 5     }
 6     public static boolean IsPopOrder(int[] pushA,int[] popA){
 7         if(pushA.length==0||popA.length==0){
 8             return false;
 9         }
10         int popIndex=0;
11         Stack<Integer> stack = new Stack<>();
12         for(int i=0;i<pushA.length;i++){
13             stack.push(pushA[i]);
14             while (!stack.isEmpty()&&stack.peek()==popA[popIndex]){
15                 stack.pop();
16                 popIndex++;
17             }
18         }
19         return stack.isEmpty();
20     }

测试:

 1 public static void main(String[] args) {
 2         Scanner x=new Scanner(System.in);
 3         while(x.hasNext()){
 4             //输入m个数字,以空格隔开
 5             int m=x.nextInt();
 6             int[] number=new int[m];
 7             for(int i=0;i<m;i++){
 8                 number[i]=x.nextInt();
 9             }
10             System.out.println(Arrays.toString(number));
11             boolean b = VerifySquenceOfBST(number);
12             System.out.println(b);
13         }
14 输入:
15 4
16 7 4 6 5
17 输出:
18 [7, 4, 6, 5]
19 false

原文地址:https://www.cnblogs.com/Blog-cpc/p/12343103.html

时间: 2024-08-03 15:23:50

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

剑指Offer 23. 二叉搜索树的后序遍历序列 (二叉搜索树)

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

【Java】 剑指offer(33) 二叉搜索树的后序遍历序列

本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入的数组的任意两个数字都互不相同. 思路 二叉树后序遍历数组的最后一个数为根结点,剩余数字中,小于根结点的数字(即左子树部分)都排在前面,大于根结点的数字(即右子树部分)都排在后面.根据遍历数组的这个特性,可以编写出一个递归函数,用于实现题目所要求的判断功能. 测

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

问题描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 背景知识: 二叉搜索树(Binary Search Tree),又叫二叉排序树:或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值: 它的左.右子树也分别为二叉排序树. 算法描述: 将数列分为三段,最后一段是最后一个数,也是树的

[剑指offer] 判断二叉搜索树的后序遍历序列

题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 输入描述 整数数组 输出描述 布尔值 题目分析 什么是二叉搜索树? 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值: 它的左.右子树也分别为二

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

题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 基本思路 在后序遍历得到的序列中,最后一个数字是树的根节点的值.数组中前面的数字可以分为两部分:第一部分是左子树节点的值,它们都比根节点的值小:第二部分是右子树节点的值,他们都比根节点的值大. 以数组{5,7,6,9,10,8}为例,后序遍历结果的最后一个数字8就是根节点的值.在这个数组中,前3个数字5,7和6都比8小,是值为8的节点的左子树节点:

剑指offer:二叉搜索树的后序遍历序列

题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. class Solution: """ 一个二叉搜索树BST满足: max(左子树) < 根节点 < min(右子树) 由于题目给出的是一个后序遍历,那么序列的最后一个元素就应该是根节点. 因此我们从BST的定义出发,遍历整个序列,找到第一个大于根节点的元素k,k以前的元素属于左子树, 从k开始到根节点之前的元素属于右

[剑指Offer] 23.二叉搜索树的后序遍历

[思路]BST的后序序列的合法序列是,对于一个序列S,最后一个元素是x (也就是根),如果去掉最后一个元素的序列为T,那么T满足:T可以分成两段,前一段(左子树)小于x,后一段(右子树)大于x,且这两段(子树)都是合法的后序序列.下面是在讨论中看到的一份代码,已学习到. 1 class Solution { 2 public: 3 bool VerifySquenceOfBST(vector<int> sequence) { 4 int size = sequence.size(); 5 if

剑指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.假设输入

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

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

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

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