`

java-50-输入两棵二叉树A和B,判断树B是不是A的子结构

 
阅读更多
思路来自:http://zhedahht.blog.163.com/blog/static/25411174201011445550396/
import ljn.help.*;
public class HasSubtree {

	/**Q50.
	 * 输入两棵二叉树A和B,判断树B是不是A的子结构。

例如,下图中的两棵树A和B,由于A中有一部分子树的结构和B是一样的,因此B就是A的子结构。


                 1                                                     8
               /   \                                                 /    \
              8     7                                                9    2
            /    \
           9     2
                /  \
               4    7
	 */
	public static void main(String[] args) {
		int[] data01={1,8,7,9,2,0,0,0,0,4,7};
		Node tree01=Helper.createTree(data01);
		int[] data02={8,9,2};
		Node tree02=Helper.createTree(data02);
		
		boolean result=hasSubtree(tree01,tree02);
		System.out.println(result);//true
		
		/*
		 * hasSubtreeByOrder() does not work.
		 * preOrder and inOrder can define a unique BTree,but 
		 * inOrderOfTree1=9,8,4,2,7,1,7
		 * inOrderOfTree2=9,8,2
		 */
		result=hasSubtreeByOrder(tree01,tree02);
		System.out.println(result);//false
		
	}

	//hasSubtree():just some "boundary condition".see hasSubtreeCore().
	public static boolean hasSubtree(Node tree1,Node tree2){
		if((tree1==null&&tree2!=null)||
				tree1!=null&&tree2==null){
			return false;
		}
		if(tree1==null&&tree2==null){
			return true;
		}
		return hasSubtreeCore(tree1,tree2);
	}
	
	public static boolean hasSubtreeCore(Node tree1,Node tree2){
		boolean result=false;
		if(tree1.getData()==tree2.getData()){//if roots are equal,test if both leftTree and rightTree are equal
			result=tree1HaveAllNodesOfTree2(tree1,tree2);
		}
		//roots are not equal
		if(!result&&tree1.getLeft()!=null){//find tree2 in tree1's left child,if exists
			result=hasSubtreeCore(tree1.getLeft(),tree2);
		}
		if(!result&&tree1.getRight()!=null){//find tree2 in tree1's right child,if exists
			result=hasSubtreeCore(tree1.getRight(),tree2);
		}
		return result;
	}
	
	public static boolean tree1HaveAllNodesOfTree2(Node tree1,Node tree2){
		if(tree2==null){
			return true;
		}
		if(tree1==null){
			return false;
		}
		if(tree1.getData()!=tree2.getData()){
			return false;
		}
		//now the roots are equal.Test left tree and right tree
		return tree1HaveAllNodesOfTree2(tree1.getLeft(),tree2.getLeft())&&
			tree1HaveAllNodesOfTree2(tree1.getRight(),tree2.getRight());
	}
	
	public static boolean hasSubtreeByOrder(Node tree1,Node tree2){
		StringBuilder sb=new StringBuilder();
		preOrder(tree1,sb);
		String preOrderOfTree1=sb.toString();
		
		sb.setLength(0);
		
		preOrder(tree2,sb);
		String preOrderOfTree2=sb.toString();
		if(preOrderOfTree1.indexOf(preOrderOfTree2)==-1){
			return false;
		}
		
		sb.setLength(0);
		inOrder(tree1,sb);
		String inOrderOfTree1=sb.toString();
		
		sb.setLength(0);
		inOrder(tree2,sb);
		String inOrderOfTree2=sb.toString();
		
		return inOrderOfTree1.indexOf(inOrderOfTree2)!=-1;
	}
	public static void preOrder(Node node,StringBuilder sb){
		if(node==null){
			return;
		}
		sb.append(node.getData()+",");
		preOrder(node.getLeft(),sb);
		preOrder(node.getRight(),sb);
	}
	public static void inOrder(Node node,StringBuilder sb){
		if(node==null){
			return;
		}
		inOrder(node.getLeft(),sb);
		sb.append(node.getData()+",");
		inOrder(node.getRight(),sb);
	}
}

0
0
分享到:
评论
2 楼 bylijinnan 2012-06-19  
neyshule 写道
tree1HaveAllNodesOfTree2这个函数为什么这样写呢:
        if(tree2==null){ 
            return true; 
        } 
        if(tree1==null){ 
            return false; 
        } 
        if(tree1.getData()!=tree2.getData()){ 
            return false; 
        } 
        //now the roots are equal.Test left tree and right tree 
        return tree1HaveAllNodesOfTree2(tree1.getLeft(),tree2.getLeft())&& 
            tree1HaveAllNodesOfTree2(tree1.getRight(),tree2.getRight()); 
为什么tree2是null就是true?tree1是null是false?


tree1HaveAllNodesOfTree2这个方法是判断是否tree1包含了tree2的所有节点,如果tree2是空树,那就认为tree1包含了tree2,反之则不是

这方法是在递归里面调用的,会有一个时候出现tee1==null 或者tree2==null
1 楼 neyshule 2012-06-19  
tree1HaveAllNodesOfTree2这个函数为什么这样写呢:
        if(tree2==null){ 
            return true; 
        } 
        if(tree1==null){ 
            return false; 
        } 
        if(tree1.getData()!=tree2.getData()){ 
            return false; 
        } 
        //now the roots are equal.Test left tree and right tree 
        return tree1HaveAllNodesOfTree2(tree1.getLeft(),tree2.getLeft())&& 
            tree1HaveAllNodesOfTree2(tree1.getRight(),tree2.getRight()); 
为什么tree2是null就是true?tree1是null是false?

相关推荐

    Java面试宝典-经典

    5、说明生活中遇到的二叉树,用java实现二叉树 66 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序: 71 7、写一个Singleton出来。 75 8、递归算法题1 77 9、递归...

    JAVA面试题最全集

    1.Java有那些基本数据类型,String是不是基本数据类型,他们有何区别。 2.字符串的操作: 写一个方法,实现字符串的反转,如:输入abc,输出cba 写一个方法,实现字符串的替换,如:输入bbbwlirbbb,输出...

    Java面试宝典2010版

    5、说明生活中遇到的二叉树,用java实现二叉树 66 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序: 71 7、写一个Singleton出来。 75 8、递归算法题1 77 9、递归...

    22春“计算机科学与技术”专业《计算方法》在线作业含答案参考10.docx

    A、直接法和间接法 B、直接法和替代法 C、直接法和迭代法 D、间接法和迭代法 参考答案:C 22春"计算机科学与技术"专业《计算方法》在线作业含答案参考10全文共4页,当前为第2页。 12. 非线性结构的逻辑特征是一个...

    java面试题大全(2012版)

    5、说明生活中遇到的二叉树,用java实现二叉树 66 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序: 71 7、写一个Singleton出来。 75 8、递归算法题1 77 9、递归...

    最新Java面试宝典pdf版

    5、说明生活中遇到的二叉树,用java实现二叉树 66 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序: 71 7、写一个Singleton出来。 75 8、递归算法题1 77 9、递归...

    Java面试笔试资料大全

    5、说明生活中遇到的二叉树,用java实现二叉树 66 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序: 71 7、写一个Singleton出来。 75 8、递归算法题1 77 9、递归...

    java面试宝典2012

    5、说明生活中遇到的二叉树,用java实现二叉树 73 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序: 78 7、写一个Singleton出来。 81 8、递归算法题1 84 9、递归...

    JAVA面试宝典2010

    5、说明生活中遇到的二叉树,用java实现二叉树 66 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序: 71 7、写一个Singleton出来。 75 8、递归算法题1 77 9、递归...

    Java面试宝典2012新版

    5、说明生活中遇到的二叉树,用java实现二叉树 66 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序: 71 7、写一个Singleton出来。 75 8、递归算法题1 77 9、递归...

    Java面试宝典2012版

    5、说明生活中遇到的二叉树,用java实现二叉树 66 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序: 71 7、写一个Singleton出来。 75 8、递归算法题1 77 9、...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    1. 层次结构模型: 层次结构模型实质上是一种有根结点的定向有序树,IMS(Information Manage-mentSystem)是其典型代表。 2. 网状结构模型:按照网状数据结构建立的数据库系统称为网状数据库系统,其典型代表是DBTG...

    C语言入门经典(第4版)--源代码及课后练习答案

    IvorHorton还著有关于C、C++和Java的多部入门级好书,如《C语言入门经典(第4版)》和《C++入门经典(第3版)》。 译者  杨浩,知名译者,大学讲师,从事机械和计算机方面的教学和研究多年,发表论文数篇,参编和翻译的...

    Java 面试宝典

    37、下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d"; .................. 25 38、try {}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会不 会被执行,什么时候被执行,在 ...

Global site tag (gtag.js) - Google Analytics