Neo's Blog

不抽象就无法深入思考
不还原就看不到本来面目!

0%

二叉树系列-二叉树子结构

二叉树子结构-题目描述

输入两棵二叉树A,B,判断B是不是A的子结构。

我们规定空树不是任何树的子结构。

样例
树A:

 8
/ \

8 7
/ \
9 2
/ \
4 7
树B:

8
/ \
9 2
返回 true ,因为B是A的子结构。

二叉树子结构-总体思路

明确一下子结构匹配的三种情况:

(1)当前子树与Target匹配

(2)当前子树的右子树与Target匹配

(3)当前子树的左子树与Target匹配

遍历方式:先序遍历

参数:两棵子树的根节点

base condition: nullptr判定

处理逻辑:

(1)重点考虑是否覆盖了所有的子结构匹配的情况

返回值:是否匹配

二叉树子结构-代码实现

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

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool hasSubtree(TreeNode* r1, TreeNode* r2) {
if (!r2) {return false;}

if (!r1) return false;

//如果当前节点不匹配,需要继续遍历子树;而不是返回
if (r1->val == r2->val) {
bool ret = true;
if (r2->left || r2->right) {
ret = (r2->left ? (hasSubtree(r1->left, r2->left)) : true) && (r2->right ? hasSubtree(r1->right, r2->right) : true);
}
if (ret) return ret;
}

return hasSubtree(r1->left, r2) || hasSubtree(r1->right, r2);
}
};
你的支持是我坚持的最大动力!