「这是我参与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实现的功能,每个题都用不同的解法和写法,我大体整理了一下自己的思路然后就写了,也没有再想其他的方法,如果你有更好的解法,欢迎和我留言,我们一起进步,一起学习数据结构,共同进步,通过这道题能更熟悉二叉树的先序优先遍历的操作。
总结
这篇文章主要解决了子树的判断的问题,我们使用递归可以巧妙的解决这个问题,同样,我们用到了二叉树的先序遍历,这也是二叉树中经常用到的遍历算法,需要我们熟练运用,熟练掌握。
如果有不当之处,欢迎指正。