码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-01-27 11:06:55      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:

转载请注明出处: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 }
View Code

运行结果:

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

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

标签:

原文地址:http://www.cnblogs.com/wuzetiandaren/p/4252095.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!