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

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4252095.html

声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明。谢谢。

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

解题思路:

  1.输入一个整型数组a,根据该数组创建二叉排序树,即二元查找树。

  2.后序遍历遍历该二叉排序树,将结果保存到另一个整形数组b。

  3.输入一个待比较的整型数组c,比较b和c里面的值是否相等。比较的方法:

    a.如果b和 c的长度不相等,返回false。

    b.否则,循环遍历b和 c中的元素,若有一个不相等则结束比较,返回false。

    c.否则,返回true。

java实现:

  1 package com.interview;
  2
  3 /**
  4  * 判断整数序列是不是二元查找树的后序遍历结果
  5  * @author wjh
  6  *
  7  */
  8 public class _9IsLRDTraversal {
  9
 10     /**
 11      * @param args
 12      */
 13     private static int k=0;
 14     public static void main(String[] args) {
 15         int[] a = {56,45,47,67,35,76,22,89,91,27,11,21,19,87};
 16         int[] b = new int[a.length];   //用于保存以a创建的二叉树的后序遍历结果
 17         int[] c = {19, 22, 11, 27, 22, 35, 47, 45, 87, 91, 89, 76, 67, 56 };
 18         Node root = null;
 19         root = createTree( root, a);   //1)建树
 20         System.out.println("打印想要比较的整数序列:");
 21         printArr(c);               //2)印想要比较的证书序列
 22         System.out.println("二叉树的后序遍历结果:");
 23         postOrder(root,b);       //3)打印后序遍历结果
 24         System.out.println();
 25         boolean result = compare(b, c);        //4)比较是否相等
 26         System.out.println("比较结果:"+result); //5)打印比较结果
 27
 28     }
 29
 30     //判断输入的整数序列是不是二元查找树的后序遍历结果
 31     private static boolean compare(int[] b, int[] c){
 32         int blength = b.length;
 33         int clength = c.length;
 34         if(blength!=clength){
 35             System.out.println("输入的数据与二叉树的长度不一致,不是该二叉树的后序遍历结果!");
 36             return false;
 37         }
 38         for(int i=0;i<blength;i++){
 39             if(b[i]!=c[i]){
 40                 System.out.println("输入的数据与该二叉树后序遍历结果不一致,不是该二叉树的后序遍历结果!");
 41                 return false;
 42             }
 43         }
 44         System.out.println("输入的数据与该二叉树后序遍历结果一致!");
 45         return true;
 46     }
 47
 48
 49     //创建二叉排序树
 50     public static Node  createTree(Node root, int[] r){
 51         int n = r.length;
 52         System.out.println("建树过程(a<--b表示在a的左边插入b;a-->b表示在a的右边插入b):");
 53         for(int i=0;i<n;i++){
 54             Node child = new Node(r[i],null,null);
 55             root = insert(root, child);
 56         }
 57         return root;
 58     }
 59
 60
 61     //二叉排序树的插入算法
 62     public static Node insert(Node root, Node child){
 63         //寻找插入位置
 64         if(root==null){
 65             root = child;
 66             System.out.println(root.data);
 67         }
 68         else
 69             if(root.data>child.data){
 70                 System.out.print(root.data+"<--");
 71                 root.left = insert(root.left, child);
 72             }
 73             else{
 74                 System.out.print(root.data+"-->");
 75                 root.right = insert(root.right,child);
 76             }
 77         return root;
 78     }
 79
 80
 81     //二叉树的后序遍历
 82     public static void postOrder(Node root,int[] b){
 83         if(root==null){
 84             return;
 85         }
 86         else{
 87             postOrder(root.left,b);
 88             postOrder(root.right,b);
 89             System.out.print(root.data+" ");
 90             b[k++] = root.data;
 91         }
 92     }
 93
 94     //打印数组
 95     private static void printArr(int[] a){
 96         int n = a.length;
 97         for(int i=0;i<n;i++){
 98             System.out.print(a[i]+" ");
 99         }
100         System.out.println();
101     }
102
103
104     //节点的数据结构
105     private static class Node {
106         public int data;
107         public Node left;   //指向左子树
108         public Node right;  //指向右子树
109         public Node() {
110             super();
111             // TODO Auto-generated constructor stub
112         }
113         public Node(int data, Node left, Node right) {
114             super();
115             this.data = data;
116             this.left = left;
117             this.right = right;
118         }
119     }
120 }

运行结果:

1. 因长度不相等:

建树过程(a<--b表示在a的左边插入b;a-->b表示在a的右边插入b):
56
56<--45
56<--45-->47
56-->67
56<--45<--35
56-->67-->76
56<--45<--35<--22
56-->67-->76-->89
56-->67-->76-->89-->91
56<--45<--35<--22-->27
56<--45<--35<--22<--11
56<--45<--35<--22<--11-->21
56<--45<--35<--22<--11-->21<--19
56-->67-->76-->89<--87
打印想要比较的整数序列:
19 21 11 27 22 35 47
二叉树的后序遍历结果:
19 21 11 27 22 35 47 45 87 91 89 76 67 56
输入的数据与二叉树的长度不一致,不是该二叉树的后序遍历结果!
比较结果:false

2.因内容不相等:

建树过程(a<--b表示在a的左边插入b;a-->b表示在a的右边插入b):
56
56<--45
56<--45-->47
56-->67
56<--45<--35
56-->67-->76
56<--45<--35<--22
56-->67-->76-->89
56-->67-->76-->89-->91
56<--45<--35<--22-->27
56<--45<--35<--22<--11
56<--45<--35<--22<--11-->21
56<--45<--35<--22<--11-->21<--19
56-->67-->76-->89<--87
打印想要比较的整数序列:
19 22 11 27 22 35 47 45 87 91 89 76 67 56
二叉树的后序遍历结果:
19 21 11 27 22 35 47 45 87 91 89 76 67 56
输入的数据与该二叉树后序遍历结果不一致,不是该二叉树的后序遍历结果!
比较结果:false

3.是二元查找树的后序遍历结果:

建树过程(a<--b表示在a的左边插入b;a-->b表示在a的右边插入b):
56
56<--45
56<--45-->47
56-->67
56<--45<--35
56-->67-->76
56<--45<--35<--22
56-->67-->76-->89
56-->67-->76-->89-->91
56<--45<--35<--22-->27
56<--45<--35<--22<--11
56<--45<--35<--22<--11-->21
56<--45<--35<--22<--11-->21<--19
56-->67-->76-->89<--87
打印想要比较的整数序列:
19 21 11 27 22 35 47 45 87 91 89 76 67 56
二叉树的后序遍历结果:
19 21 11 27 22 35 47 45 87 91 89 76 67 56
输入的数据与该二叉树后序遍历结果一致!
比较结果:true

时间: 2024-08-27 21:41:42

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

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

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

微软算法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的特性是左子树必然全部小

第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. 由于二叉查找树的特性(左子树的值小于根节点,右子树的值

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 . 思路:对于树的很多问题都是可以使用递归来解决.这道题也不例外.首先明白后序遍历的特点,最后一个是根元素.左子树都比根元素打,右

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

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

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

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

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

比如给出数组[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