树的子结构

89 阅读2分钟

「这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战

树的子结构

题目

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

B是A的子结构, 即 A中有出现和B相同的结构和节点值。

例如:
给定的树 A:

3 / \ 4 5 / \ 1 2
给定的树 B:

4 / 1
返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。

示例 1:

输入: A = [1,2,3], B = [3,1]
输出: false

示例 2:

输入: A = [3,4,5,1,2], B = [4,1]
输出: true

限制:

0 <= 节点个数 <= 10000

题目分析

题目一看比较清晰,就是给定两棵树,判断这棵树是不是另一个树的子树,我们用到的知识点是树的先序遍历和回溯算法。

代码实现

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isSubStructure(TreeNode A, TreeNode B) {

        return (A!=null && B!=null) && (recure(A,B) || isSubStructure(A.left,B) || isSubStructure(A.right,B));

    }

    public boolean recure (TreeNode A,TreeNode B) {
        if (B == null) {
            return true;
        }
        if (A ==null || A.val != B.val) {
            return  false;
        }
        return  recure(A.left,B.left) && recure(A.right,B.right);
    }
}

首先到A是null或者B是空的时候,直接是false。

然后定义recure (TreeNode A,TreeNode B)这个方法来比较A B节点,然后使用递归拿A的左子树和B进行比较,再拿A的右子树和B进行比较,其中有一个条件满足就说明B是A的子树。

这是我用java实现的功能,每个题都用不同的解法和写法,我大体整理了一下自己的思路然后就写了,也没有再想其他的方法,如果你有更好的解法,欢迎和我留言,我们一起进步,一起学习数据结构,共同进步,通过这道题能更熟悉二叉树的先序优先遍历的操作。

总结

这篇文章主要解决了子树的判断的问题,我们使用递归可以巧妙的解决这个问题,同样,我们用到了二叉树的先序遍历,这也是二叉树中经常用到的遍历算法,需要我们熟练运用,熟练掌握。

如果有不当之处,欢迎指正。