剑指offer-树的子结构

 

题目描述

 

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

 

解题思路

 

考虑构造HasSubTree函数前序遍历树A递归判断子结构。从树A的根节点开始每遍历到一个节点,判断其结点值是否与树B的根节点值相等,若相等则调用IsSub函数判断A的此子树是否包含树B。具体来说,IsSub函数从树B的根节点开始与子树根节点比较,若不等则直接返回false,否则递归比较树B的左子树和右子树直到叶子节点,如果遍历完树B发现结点值都相等,则返回true。回到HasSubTree函数中,若此子树包含树B,那么直接返回true,否则继续递归判断左子树与右子树是否包含树B。若遍历完树A仍未发现树B,就返回false。

 

代码

 

 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 HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
13     {
14         if(pRoot1==NULL||pRoot2==NULL)
15             return false;
16         if(pRoot1->val==pRoot2->val)
17             if(IsSub(pRoot1,pRoot2))
18                 return true;
19         else{
20             if(pRoot1->left)
21                 if(HasSubtree(pRoot1->left,pRoot2))
22                     return true;
23             if(pRoot1->right)
24                 if(HasSubtree(pRoot1->right,pRoot2))
25                     return true;
26         }
27         return false;
28     }
29     bool IsSub(TreeNode* pRoot1, TreeNode* pRoot2){
30         if(pRoot1->val!=pRoot2->val)
31             return false;
32         if(pRoot2->left){
33             if(pRoot1->left){
34                 if(!IsSub(pRoot1->left,pRoot2->left))
35                     return false;
36             }
37             else 
38                 return false;
39         }
40         if(pRoot2->right){
41             if(pRoot1->right){
42                 if(!IsSub(pRoot1->right,pRoot2->right))
43                     return false;
44             }
45             else
46                 return false;
47         }
48         return true;
49     }
50 };

 

posted @ 2018-04-19 11:35  FlyingWarrior  阅读(147)  评论(0编辑  收藏  举报