树的子结构

16 篇文章 1 订阅
13 篇文章 0 订阅

https://www.nowcoder.com/practice/6e196c44c7004d15b1610b9afca8bd88?tpId=13&tqId=11170&tPage=1&rp=1&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking

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

这个题首先就是判断树A和树B是否为空了。

接下来就是在A里面找跟B的根节点相等的点!

找到了以后,因为是判断B是否是A的子序列,所以B是那个小的集合,所以就深度遍历B,然后A也跟B一样的方式遍历!B找左子树,A也找左子树,B找右子树,A也找右子树!

每个节点就判断它自己是否和规范以及,它的孩子是否符合规范。

如果B一个节点的某个孩子为空,那就证明这个点就是叶子节点了,A对应的点只要相等就行了,没必要A的对应孩子也是空,毕竟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  is_equal(TreeNode root2,TreeNode root1) {
		if(root2==null)
			return true;
		if(root1==null)
			return false;
		if (root2.val==root1.val)	  
				 return  is_equal(root2.left, root1.left) && is_equal(root2.right, root1.right) ; 
		else 
			return false;			 
	 }
	 	 
	 public boolean  find_root(TreeNode root1,TreeNode root2) {
	 if (root1.val!=root2.val)
	 {
		 if(root1.left!=null)
			return  find_root(root1.left, root2);

		 if(root1.right!=null)
			return   find_root(root1.right, root2);
	 } 
	 else {
		 if(is_equal(root2, root1)==true)
			 return true;
		 else {
			 if(root1.left!=null)
				return  find_root(root1.left, root2);

			 if(root1.right!=null)
				 return find_root(root1.right, root2);
		}
		}
	return false;			 
	 }

	 public  boolean HasSubtree(TreeNode root1,TreeNode root2) {
		    if(root2 ==null || root1==null)
		       return false;
		    else 
		    	return find_root(root1,root2);	
		    }

}

这个代码好在哪里呢?好在分的比较开,每个函数实现的功能比较单一,看了好理解点!(菜鸡如此安慰自己)

差在哪里呢?没优化!对就是没优化!

 

上个大神的代码:

class Solution {
    bool isSubtree(TreeNode* pRootA, TreeNode* pRootB) {
        if (pRootB == NULL) return true;
        if (pRootA == NULL) return false;
        if (pRootB->val == pRootA->val) {
            return isSubtree(pRootA->left, pRootB->left)
                && isSubtree(pRootA->right, pRootB->right);
        } else return false;
    }
public:
    bool HasSubtree(TreeNode* pRootA, TreeNode* pRootB)
    {
        if (pRootA == NULL || pRootB == NULL) return false;
        return isSubtree(pRootA, pRootB) ||
            HasSubtree(pRootA->left, pRootB) ||
            HasSubtree(pRootA->right, pRootB);
    }
};

这个办法用到了判断的短路特性!

也就是if(a||b||c||d)  只要其中一个满足了是true,后面的就不用执行了!像不像if判断句?

或者是if(a&&b&&c&&d),只要一个满足为false,后面的也不执行!是不是也是if判断句的优化!

两个代码的差距就是大神和菜鸡的差距!

菜鸡需要继续写代码!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值