剑指17.树的子结构

题目描述

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

分析

若树B是树A的子结构,则子结构的根节点可能为树A的任意一个节点。因此,需要完成以下两步操作:
  • 第一步:在树A中找到和树B的根节点的值一样的节点 R (也就是树A的遍历);
  • 第二步:判断树A中以 R 为根节点的子树是不是包含和树B一样的结构。
 
注意:与二叉树相关的代码有大量的指针操作,每次访问指针地址时要警惕这个指针有没有可能是nullptr,如果是该如何处理?!
 

☆☆☆题解

/**
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) {
        if(root1 == null || root2 == null) return false;
        return judge(root1,root2) || HasSubtree(root1.left,root2) || HasSubtree(root1.right,root2);
    }
    private boolean judge(TreeNode root1,TreeNode root2){
        if(root2 == null) {
            return true;
        }
        if(root1 == null) {
            return false;
        }
        if(root1.val != root2.val) {
            return false;
        }
        return judge(root1.left,root2.left) && judge(root1.right,root2.right);
    }
}

 

 

posted @ 2020-08-10 15:32  不学无墅_NKer  阅读(94)  评论(0编辑  收藏  举报