前言
-🏀大家好,我是BXuan,热爱编程与篮球的软件工程大二学生一名
-📚当爱上Coding&&Studying的那一刻…
-🏃放弃不难,但坚持一定很酷。
🏆面试题26.树的子结构
传送地址
难度:中等
🔊问题描述:
输入两棵二叉树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
🏀解题思路:
如果树B是树A的子结构,那么,树A中的任意一个结点都有可能是树B的根节点。
所以需要先完成一下两步工作:
1、先序遍历树A的每个节点,找到与树B根节点相同的结点。 (函数:isSubStructure(A,B)😉
2、判断1中判断完的结点是否与树B中的各个节点相同(函数:dfs(A,B);)
dfs(A,B)函数:
终止条件:
1、当B为空的时候,也就是树B全部遍历完成,此时应当返回true;
2、当A为空的时候,能经过前一个if条件说明此时B还不为空,但A为空了,说明A的结构还不足以匹配B的结构,所以B不是A的子结构,返回false;
3、进行遍历操作:继续遍历左节点与右节点的值。
isSubStructure(A,B)函数:
1、进行特殊化判断
2、递归,递归条件为深度搜索当前的结点,然后继续寻找A的左节点及右节点是否会作为B的根节点。
🥇代码示例:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
// 首先找到B的根节点
public boolean isSubStructure(TreeNode A, TreeNode B) {
// 特殊化处理
if(A == null || B == null){
return false;
}
// 这里为什么要加isSubStructure函数两边呢?
// 前面已经说过,有可能A的任意一个节点都是B的根节点。
return dfs(A,B)||isSubStructure(A.left,B)||isSubStructure(A.right,B);
}
// 深度优先搜索算法
private boolean dfs(TreeNode A, TreeNode B){
// 如果B为空,说明已经完全找到
if(B == null){
return true;
}
// 如果A为空或者A与B节点的值不相等,返回false
if(A == null || A.val != B.val){
return false;
}
return dfs(A.left,B.left) && dfs(A.right,B.right);
}
}