题目描述
输入两棵二叉树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 }