剑指offer之编程(十三)

题目描述:

输入两颗二叉树A,B,判断B是不是A的子结构。


思路:题目已经指出是二叉树,B是A的子结构即B是否为A的一部分。大概分为两步:1.首先通过B的根节点,遍历A树找此节点在A中的位置。2.找到相应的根节点后,就分别比较B的子树和找到的节点的子树,如果相同,那么B就是A的子结构;如果不相同,那么就不是A的子结构。(注意A,B树是否为空,树的边界判断是非常重要的,一不小心,程序就会崩溃)


代码如下:


import java.util.*;

public class Main19 
{

	public static void main(String[] args)  //用笨方法建了个简单的二叉树,进行的测试      = = 
	{
		TreeNodes Aroot = new TreeNodes(8);
		TreeNodes Aroot1 = new TreeNodes(8);
		TreeNodes Aroot2 = new TreeNodes(7);
		TreeNodes Aroot3 = new TreeNodes(9);
		TreeNodes Aroot4 = new TreeNodes(2);
		TreeNodes Aroot5 = new TreeNodes(4);
		Aroot.left = Aroot1;
		Aroot.right = Aroot2;
		Aroot1.left = Aroot3;
		Aroot1.right = Aroot4;
		Aroot4.left = Aroot5;
		
		TreeNodes Broot = new TreeNodes(8);
		TreeNodes Broot1 = new TreeNodes(9);
		TreeNodes Broot2 = new TreeNodes(2);
		Broot.left = Broot1;
		Broot.right = Broot2;
		
		System.out.println(HasSubTree(Aroot, Broot));

	}
	
	public static boolean HasSubTree(TreeNodes ARoot,TreeNodes BRoot)  //查找是否有相应的B的子树
	{
		boolean hasTree = false;
		
		if(ARoot!=null && BRoot!=null)
		{
			if(ARoot.val==BRoot.val)
			{
				hasTree = NodeEquelVal(ARoot,BRoot);  //找到根节点后,检查其子树是否匹配
			}
			
			if(!hasTree)  //如果没找到相应的根节点或者其他节点不匹配,那么就遍历A树的左子树查找
			{
				hasTree = HasSubTree(ARoot.left, BRoot);
			}
			
			if(!hasTree)  //遍历右子树
			{
				hasTree = HasSubTree(ARoot.right, BRoot);
			}
		}
		
		return hasTree;
	}
	
	public static boolean NodeEquelVal(TreeNodes ARoot,TreeNodes BRoot)  //找到根节点后,检查子树是否匹配
	{
		if(BRoot==null)
			return true;
		if(ARoot==null)
			return false;
		if(ARoot.val!=BRoot.val)
			return false;
		return NodeEquelVal(ARoot.left, BRoot.left) && NodeEquelVal(ARoot.right, BRoot.right);  //使用递归判断子树节点是否相等
	}

}

class TreeNodes   //二叉树的节点类
{
	int val;
	TreeNodes left = null;
	TreeNodes right = null;
	
	public TreeNodes(int val)
	{
		this.val = val;
	}
}


本人经验,仅供参考!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值