树的子结构

Posted cold-windy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树的子结构相关的知识,希望对你有一定的参考价值。


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

直接递归,
递归结束条件:如果root2为空,返回true(提前判断了root2一开始就为空的情况),那么在root2不为空的情况下,root1为空,说明这里肯定不对,返回false;
主要逻辑判断:如果root1.val==root2.val,那么此时有两种情况,包含这个root节点是子结构的一部分,所以我们进入
1
helper(root1.left,root2.left)&&helper(root1.right,root2.right)
如果不包含这个节点,我们就不能取这个root,所以进入
1
helper(root1.left,root2)||helper(root1.right,root2)
两种情况一种成立就可以,所以中间用||连接
回到开始,如果root1.val!=root2.val,也就是进入那个else判断,那么我们就直接返回这个结果就可以了。
1
helper(root1.left,root2)||helper(root1.right,root2)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**
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(root2==null)
            return false;
        return helper(root1,root2);
    
    public boolean helper(TreeNode root1,TreeNode root2)
    
        if(root2==null)
            return true;
        if(root1==null)
            return false;
        if(root1.val==root2.val)
            return (helper(root1.left,root2.left)&&helper(root1.right,root2.right))||(helper(root1.left,root2)||helper(root1.right,root2));
        else
            return helper(root1.left,root2)||helper(root1.right,root2);
    

以上是关于树的子结构的主要内容,如果未能解决你的问题,请参考以下文章

数据结构中树的计数

树的子结构

树的子结构

树的子结构

剑指offer-树的子结构

数据结构复习笔记——树的基本概念及结构