剑指offer--树的子结构 Java实现

 

题目描述

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

解题思路: /*    二叉树A              二叉树 B
         *                 2                           2        
         *                / \                          / \        
         *              8   7                      4   7    
         *             / \                         
         *           9   2                       
         *               / \                         
         *             4   7                        
         */         

就好像一个女孩子想要男朋友,始于颜值,陷于才华。二叉树B的根节点就相当于颜值,它要先在A中要一个颜值相符的,找到之后再慢慢了解到底是否合适。如果发现不合适,就再找下一个颜值相符的。如果合适,(也就是它的所有子树都能匹配上)那就原地结婚吧!

/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
    public TreeNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    public boolean HasSubtree(TreeNode root1,TreeNode root2) {
		boolean res = false;
		if (root1 == null || root2 == null ) {
			return res;
		}
		if (root1.val == root2.val) {
			res = helper(root1,root2);//颜值匹配,再去匹配各项其他。
		}
		if (res == false) { //糟糕,虽然颜值匹配,但是相处过程发现不太合适,那就找下一个合适的 起点重新开始。
			res = HasSubtree(root1.left,root2);
		}
		if (res == false) {
			res = HasSubtree(root1.right, root2);
		}
		return res;
	    }
	
	public boolean helper(TreeNode root1,TreeNode root2) {
		if (root2 == null) {
			return true; //出口是root2遍历完,也就是所有的条件都合适!
		}
		if (root1 == null) {
			return false;
		}
		if (root1.val != root2.val) {
			return false;
		}
		return helper(root1.left,root2.left) && helper(root1.right,root2.right);
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涵sue

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值