【剑指offer】22.树的子结构

总目录:

算法之旅导航目录

 

1.问题描述

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

假如给定A为{8,8,7,9,2,#,#,#,#,4,7},B为{8,9,2},2个树的结构如下,可以看出B是A的子结构 

 

 

 

 

2.问题分析

 1递归

注意以下条件:

(1)空树不是任意一个树的子结构;

(2)B树根节点下面的子树如果为空则判定为true,即不必追求B树跟A中找到的“根节点”以下部分完全一致,B是A的子集即可;


3.代码实例

 1 /*
 2 struct TreeNode {
 3     int val;
 4     struct TreeNode *left;
 5     struct TreeNode *right;
 6     TreeNode(int x) :
 7             val(x), left(NULL), right(NULL) {
 8     }
 9 };*/
10 class Solution {
11   public:
12     bool IsEqualTree(TreeNode* root1, TreeNode* root2) {
13         //中止条件
14         if (root2 == NULL) {
15             return true;
16         }
17         if (root1 == NULL) {
18             return false;
19         }
20         if (root1->val != root2->val) {
21             return false;
22         }
23 
24         //本层业务
25 
26         //递归调用
27         return IsEqualTree(root1->left, root2->left) &&
28                IsEqualTree(root1->right, root2->right);
29     }
30 
31     bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
32         //中止条件
33         if (pRoot1 == NULL || pRoot2 == NULL) {
34             return false;
35         }
36 
37         //本层逻辑
38         //调用递归,查找子树上是否有该树
39         return IsEqualTree(pRoot1, pRoot2)
40                || HasSubtree(pRoot1->left, pRoot2)
41                || HasSubtree(pRoot1->right, pRoot2);
42     }
43 };
View Code

 

posted @ 2022-11-12 18:52  啊原来是这样呀  阅读(44)  评论(0)    收藏  举报