树的子结构

声明:本题是剑指offer中的一道题目,但是看了何海涛的日志,我的思路和他的思路有些不同。这里写下我自己思路和代码。

题目:二叉树的结点定义如下。

思路:判断root2是不是root1的子树,首先判断从root1开始的最上面的子树和root2是不是相同,如果相同,则返回true,如果不相同就判断root1.left和root1.right对应的子树是不是包含root2。

所以代码分两个函数,一个函数是hasSubtree(TreeNode root1, TreeNode root2),用来判断root2是不是root1的子树。

subTree(TreeNode root1,TreeNode root2)用来判断从root1节点起的最上面的子树是不是和root2相等。


代码:

/**
 * 输入两棵二叉树A和B,判断树B是不是A的子结构。
 * @author hongbin.gao
 * 
 * 思路:现在A中寻找与B树的根节点值相同的节点,然后再判断这个节点下面是不是与B树相同
 *
 */
class TreeNode{  //树节点
	int val;
	TreeNode left;
	TreeNode right;
	public TreeNode(int val){
		this.val = val;
	}
}

public class HasSubtree {
	public static void main(String[] args){
		TreeNode head1 =new TreeNode(1);
		TreeNode p1 = new TreeNode(8);
		TreeNode p2 = new TreeNode(7);
		TreeNode p3 = new TreeNode(9);
		TreeNode p4 = new TreeNode(2);
		TreeNode p5 = new TreeNode(4);
		TreeNode p6 = new TreeNode(7);
		head1.left = p1; head1.right =p2;
		p2.left = p2.right = null;
		p1.left = p3; p1.right = p4;
		p3.left = p3.right =null;
		p4.left = p5; p4.right = p6;
		p5.left = p5.right = null;
		p6.left = p6.right =null;
		
		TreeNode head2 =new TreeNode(8);
		TreeNode q1 = new TreeNode(9);
		TreeNode q2 = new TreeNode(2);
		head2.left = q1;
		head2.right = q2;
		q1.left = q1.right = null;
		q2.left = q2.right =null;
		
		boolean result = hasSubtree(head1,head2);
		System.out.println(result);
	}
	
	public static boolean hasSubtree(TreeNode root1, TreeNode root2){
		if(root2 == null)  //root2为null
			return true;
		if(root1 == null && root2 != null) //root1为null,root2不为null,之间返回false。
			return false;
		
	    if(subtree(root1,root2)) 
			return true;
	    else
	    	return (hasSubtree(root1.left,root2) || hasSubtree(root1.right, root2));
		
	}
	
	public static boolean subtree(TreeNode root1,TreeNode root2){  //root1最上面是不是和root2相等
		if(root2 == null)
			return true;
		if(root1 == null && root2 != null)
			return false;
		
		if(root1.val != root2.val)
			return false;
		
		if(root1.val == root2.val){
			if(subtree(root1.left, root2.left) && subtree(root1.right,root2.right))
				return true;
			else
				return false;
		}
		else 
			return false;
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值