剑指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 };