第9题:判断整数序列是不是二元查找树的后序遍历结果

欢迎转载,转载请务必注明出处:http://blog.csdn.net/alading2009/article/details/44872143

第9题:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。

例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:

因此返回true。

如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。

由于二叉查找树的特性(左子树的值小于根节点,右子树的值大于根节点),结合后序序列,可以找到一颗二叉查找树。有点类似于快速排序,对子树进行递归判断。

代码

package test009;

/**
 * Created by cq on 2015/4/3.
 * 第9题:输入一个整数数组,判断该二叉树是不是某二元查找树的后序遍历的结果。如果是返回true;否则返回false。
 */
public class Test009 {
    public static boolean existCorrespondBSTree(int[] arr){
        if (arr == null){
            return false;
        }
        return childRecursion(arr,0,arr.length-1);
    }
    public static boolean childRecursion(int[] arr, int left, int right){
        //到达叶节点
        if (left == right){
            return true;
        }
        int mid = 0;
        boolean leftChildEnd = false;
        for (int i = left ; i<right ; i++){
            //从左到右,遇到第一个比根节点值大的节点,即认为到达左子树边界(右子树起点)
            if (!leftChildEnd && arr[i] > arr[right]){
                mid = i;
                leftChildEnd = true;
            }
            //若在右子树中存在值比根节点小的节点,直接判定为false
            else if (leftChildEnd && arr[i] < arr[right]){
                return false;
            }
        }
        //左子树为空
        if (mid == left){
            return childRecursion(arr,mid,right-1);
        }
        //右子树为空
        else if (mid == right){
            return childRecursion(arr,left,mid-1);
        }
        else
            return childRecursion(arr,left,mid-1) && childRecursion(arr,mid,right-1);
    }
    public static void printArray(int[] arr){
        for (int i:arr){
            System.out.print(i+" ");
        }
    }
    public static void main(String[] args){
        int[] arr = {5,7,6,9,11,10};
        Test009.printArray(arr);
        System.out.println("是一个二叉查找树的后序序列:"+Test009.existCorrespondBSTree(arr)+"\n");
        int[] arr2 = {7,4,6,5};
        Test009.printArray(arr2);
        System.out.println("是一个二叉查找树的后序序列:"+Test009.existCorrespondBSTree(arr2)+"\n");
        int[] arr3 = {7,11,16,20,52,51,50,18};
        Test009.printArray(arr3);
        System.out.println("是一个二叉查找树的后序序列:"+Test009.existCorrespondBSTree(arr3));
    }
}

执行结果

Connected to the target VM, address: ‘127.0.0.1:2715‘, transport: ‘socket‘
Disconnected from the target VM, address: ‘127.0.0.1:2715‘, transport: ‘socket‘
5 7 6 9 11 10 是一个二叉查找树的后序序列:true

7 4 6 5 是一个二叉查找树的后序序列:false

7 11 16 20 52 51 50 18 是一个二叉查找树的后序序列:true

Process finished with exit code 0
时间: 2024-10-27 11:18:23

第9题:判断整数序列是不是二元查找树的后序遍历结果的相关文章

微软算法100题09 判断整数序列是不是二元查找树的后序遍历结果

9. 判断整数序列是不是二元查找树的后序遍历结果题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果.如果是返回true,否则返回false.例如输入5.7.6.9.11.10.8,由于这一整数序列是如下树的后序遍历结果:8/ \6 10/ \ / \5 7 9 11因此返回true.如果输入7.4.6.5,没有哪棵树的后序遍历的结果是这个序列,因此返回false. 思路:如果一个数组为BST的后序遍历结果 则最后一个元素必然为该BST的根节点 因为BST的特性是左子树必然全部小

【编程题目】判断整数序列是不是二元查找树的后序遍历结果,如果是,构建该二元查找树

判断整数序列是不是二元查找树的后序遍历结果题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果.如果是返回 true,否则返回 false.例如输入 5.7.6.9.11.10.8,由于这一整数序列是如下树的后序遍历结果:8/ \6 10/ \ / \5 7 9 11因此返回 true.如果输入 7.4.6.5,没有哪棵树的后序遍历的结果是这个序列,因此返回 false. 做这个题目的时候最开始傻了,想着从前到后根据数字的大小关系判断.后来幡然醒悟,根据后序遍历的特点.序列最后一

9判断整数序列是不是二元查找树的后序遍历结果

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4252095.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果.如果是返回true,否则返回false. 解题思路: 1.输入一个整型数组a,根据该数组创建二

IT公司100题-9-判断整数序列是不是二元查找树的后序遍历结果

问题描述: 输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果. 如果是返回true,否则返回false. 例如输入4, 8, 6, 12, 16, 14, 10,由于这一整数序列是如下树的后序遍历结果: 10/     \6      14/  \    /   \4   8 12    16 因此返回true. 如果输入6, 5, 8, 5, 7 ,则返回false. 分析: 在后续遍历得到的序列中,最后一个元素为树的根结点.根节点元素将数组分为两部分,左边都小于根节点,右边都大

6.二元查找树的后序遍历结果

http://zhedahht.blog.163.com/blog/static/25411174200725319627/ 题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果.如果是返回true,否则返回false. 例如输入5.7.6.9.11.10.8,由于这一整数序列是如下树的后序遍历结果: 8       /  \      6    10    / \    / \   5   7   9  11 因此返回true. 如果输入7.4.6.5,没有哪棵树的后序遍历的结

判断一个序列是否是一个二叉查找树的后序遍历结果

题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果.如果是返回 true,否则返 回 false . 例如输入 5.7.6.9.11 .10.8,由于这一整数序列是如下树的后序遍历结果: 8 / \ 6 10 / \ / \ 5 7 9 11 因此返回 true. 如果输入 7.4.6.5,没有哪棵树的后序遍历的结果是这个序列,因此返回 false . 思路:对于树的很多问题都是可以使用递归来解决.这道题也不例外.首先明白后序遍历的特点,最后一个是根元素.左子树都比根元素打,右

判断数组是不是某二叉搜索树的后序遍历

题目:输入一个数组,判断数组是不是某二叉搜索树的后序遍历.输入的数组的任意两个数字都不相同 分析:要明白题目的意思,意思就是判断一个数组是否是某个搜索树的后序遍历.首先要搞清搜索树的含义:跟结点大于左子树而小于右子树.其次,数组的最后一个结点一定是后序遍历的根节点.所以我们只要满足这两个条件,再通过递归就可以解出来了.代码如下: // 二叉搜索树的遍历序列.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream

已知二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列

题目描述 输入二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列. 输入 第一行输入二叉树的先序遍历序列: 第二行输入二叉树的中序遍历序列. 输出 输出该二叉树的后序遍历序列. 示例输入 ABDCEF BDAECF 示例输出 DBEFCA #include <iostream> #include <cstring> #define MAX 50+3 using namespace std; typedef char Elem_Type; typedef struct B

判断一个数组是否是一个二叉排序树的后序遍历结果

比如给出数组[5,7,6,9,11,10,8]判断其是否为二叉排序树的后序遍历结果,也就是能不能画出一个二叉排序树使其的后序遍历结果与这个数组相同,若可以返回true,不可以返回false. 代码: int is_valid(int *data, int n){ if(data==NULL)return 0; int left=1; int right=1; int i=0; int j; int root=data[n-1]; while(data[i]<root){ i++; } for(j