二叉树 判断是否为子树解题报告 (百度2016暑期实习笔试)

百度 2016 暑期实习在线笔试解题报告

题目:给定两个二叉树、判断其中一颗二叉树是否为另一颗二叉树的子树(假定树中的元素都是唯一的)


例如:二叉树  

           A:                    6                        和         B:          4

                            5               4                                       1           0

                       3        2      1       0

B 为 A 的子树   

         

          A:                    6                        和         B:          6

                            5               4                                       5           4

                       3        2      1       0



对于二叉树问题,最直观的解法 莫过于 分治递归了,

对于此问题   首先要找到 B 的根节点 在 A 中的匹配元素,然后 左右 节点递归的去匹配 (写递归程序时 大体逻辑不难,难点在与递归出口条件的判断,很容易疏忽一些细节)

看程序最能理解其中的逻辑与细节


public boolean isSub(Node root1, Node root2) {
		
		if (root2 == null) {   // 空树肯定是 非空树的子树
			return true;
		}
		return ismatch(root1, root2);
	}
	
	// 判断 根节点为root2的树是否为 根为root1树 的子树 
	private boolean ismatch (Node root1, Node root2) {
		if (root1 == null) {
			return false;
		}
		if (root1.val == root2.val) {      // 找到 与 B 的根节点匹配的节点 
			if (match(root1, root2)) {     // 然后 判断 这两个树是否匹配
				return true;
			}
		}
		
		return ismatch(root1.left, root2) || ismatch(root1.right, root2);  //递归的在 A 中找到与 B 的根节点匹配的节点
	}
	
	// 判断两颗树 是否匹配
	private boolean match(Node root1, Node root2) {
		
		if (root1 == null && root2 == null) {      // 注意递归出口,只有匹配到叶节点 才算完全匹配 true
			return true;
		}
		if (root1 == null || root2 == null) {      // 注意递归出口,只有匹配到叶节点 才算完全匹配  否则 false 
			return false;
		}
		if (root1.val != root2.val) {            // 节点元素不相等 , false
			return false;
		}
		
		return match(root1.left, root2.left) && match(root1.right, root2.right);  // 分别比较左右节点
	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值