17、剑指offer--树的子结构

题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
 
解题思路:
1、在1中找到与2根节点相同的结点R
2、判断1中以R为根节点的子树是否包含2
3、如果不包含,再在1的左子树、右子树分别找,直到全部找完
 1 #include <iostream>
 2 #include <malloc.h>
 3 using namespace std;
 4 struct TreeNode {
 5     int val;
 6     struct TreeNode *left;
 7     struct TreeNode *right;
 8     TreeNode(int x) :
 9             val(x), left(NULL), right(NULL) {
10     }
11 };
12 class Solution {
13 public:
14     //1、在1中找到与2根节点相同的结点R
15     //2、判断1中以R为根节点的子树是否包含2
16     //3、如果不包含,再在1的左子树、右子树分别找,知道全部找完
17     bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
18     {
19         bool result = false;
20         if(pRoot1 != NULL && pRoot2 != NULL)
21         {
22             if(pRoot1->val == pRoot2->val)
23             {
24                 result = Tree1HasTree2(pRoot1,pRoot2);
25             }
26             if(!result)
27             {
28                 result = HasSubtree(pRoot1->left,pRoot2);
29             }
30             if(!result)
31             {
32                 result = HasSubtree(pRoot1->right,pRoot2);
33             }
34         }
35         return result;
36     }
37     bool Tree1HasTree2(TreeNode *pRoot1,TreeNode *pRoot2)
38     {
39         if(pRoot2 == NULL)
40             return true;
41         if(pRoot1 == NULL)
42             return false;
43         if(pRoot1->val != pRoot2->val)
44             return false;
45         //1的左右子树是否和2的左右子树匹配
46         return Tree1HasTree2(pRoot1->left,pRoot2->left)&&Tree1HasTree2(pRoot1->right,pRoot2->right);
47     }
48 };
49 //先序建立二叉树
50 TreeNode *CreateBiTree(){
51     int ch;
52 
53     TreeNode *T;
54     cin>>ch;
55     if(ch== 0)T=NULL;
56     else{
57         T = (TreeNode *)malloc(sizeof(TreeNode));
58         T->val = ch;
59         cout<<"输入左子节点"<<endl;
60         T->left = CreateBiTree();
61         cout<<"输入右子节点"<<endl;
62         T->right = CreateBiTree();
63     }
64     return T;//返回根节点
65 }
66 //先序遍历二叉树
67 void PreOrderTraverse(TreeNode *T){
68     if(T)
69     {
70        cout<<T->val<<" ";
71        PreOrderTraverse(T->left);
72        PreOrderTraverse(T->right);
73     }
74 }
75 int main()
76 {
77     TreeNode *T1;
78     cout<<"输入根节点:"<<endl;
79     T1 = CreateBiTree();//建立
80     cout<<"树1的先序遍历为"<<endl;
81     PreOrderTraverse(T1);//输出
82     cout<<endl;
83     cout<<"输入根节点:"<<endl;
84     TreeNode *T2;
85     T2 = CreateBiTree();//建立
86     cout<<"树2的先序遍历为"<<endl;
87     PreOrderTraverse(T2);//输出
88     cout<<endl;
89     Solution s;
90     bool res;
91     res = s.HasSubtree(T1,T2);
92     if(res)
93         cout<<"树2是树1的子树"<<endl;
94     else
95         cout<<"树2不是树1的子树"<<endl;
96     return 0;
97 }

posted @ 2017-05-17 15:58  qqky  阅读(171)  评论(0编辑  收藏  举报