剑指Offer 牛客 JZ17 树的子结构 较难

题目:
在这里插入图片描述
题目链接
剑指Offer 牛客 JZ17 树的子结构 较难_第1张图片

思路:
首先先找出A树中有没有B的根结点,如果没有,直接返回false。
注意,A是二叉树,不是搜索树,所以key有可能是会重复的,所以要把所有值和B根结点相同的结点保存起来
接下来判断是否是子结构:
联想到二叉树的镜像递归做法,用递归判断同方向的结点值是否相等
注意点!!因为判断的是子结构,有可能出现判断完后,A树的孩子结点并不是null的情况,所以递归结束条件要稍加修改

代码:

public class Solution {
    public class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;

        public TreeNode(int val) {
            this.val = val;

        }
    }

    <TreeNode> list = new ArrayList<>();
    
    public boolean HasSubtree(TreeNode root1,TreeNode root2) {
        if(root1 == null || root2 == null){
            return false;
        }
        findNode(root1, root2);
        if (list.size() == 0){
            return false;
        }
        for (TreeNode node : list){
            if (process(node, root2)){
            	//找到即可返回true
                return true;
            }
        }
        return false;
    }
    
    public void findNode(TreeNode node1,TreeNode node2){
        if (node1 == null){
            return;
        }
        if (node1.val == node2.val){
            list.add(node1);
        }
        findNode(node1.left, node2);
        findNode(node1.right, node2);
    }
    
    public boolean process(TreeNode node1,TreeNode node2){
        if (node1 == null && node2 == null){
            return true;
        }
        //当node2==null,node1!=null时其实是true
        if (node2 == null){
            return true;
        }
        //node1==null && node2!=null,肯定是false
        if (node1 == null){
            return false;
        }
        if (node1.val != node2.val){
            return false;
        }
        //求镜像是process(node1.left, node2.right) && process(node1.right, node2.left)
        return process(node1.left, node2.left) && process(node1.right, node2.right);
    }
}

在这里插入图片描述

你可能感兴趣的:(算法)