-
题目描述:
输入两棵二叉树A,B,判断B是不是A的子结构。(我们约定空树不是任意一个树的子结构)
-
分析:
基本思想是分两步:
- 遍历树A,先找到A中与B的根值相等的结点R;
- 然后再判断树A中以R为根结点的子树是不是包含和树B一样的结构。
显然这两部过程中都需要遍历二叉树,而二叉树的遍历一般用递归完成。第一步在树A中查找与树B根结点的值一样的结点,实际就是树的遍历:
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) { bool result = false; if(pRoot1 != NULL && pRoot2 != NULL){ if(pRoot1->val == pRoot2->val) result = DoesTree1HaveTree2(pRoot1,pRoot2); if(!result) result = HasSubtree(pRoot1->left,pRoot2); if(!result) result = HasSubtree(pRoot1->right,pRoot2); } return result; }
第二步是判断A中以R为根结点的子树是不是和树B有相同的结构。同样也是递归的思路:如果结点R的值和树B的根结点不同,则两者不具有相同的结点;如果值相同,则递归的判断它们各自的左右结点的值是不是相同。递归的终止条件是我们到达了树A或者树B的叶结点。
bool DoesTree1HaveTree2(TreeNode* pRoot1,TreeNode* pRoot2){ if(pRoot2 == NULL) return true; if(pRoot1 == NULL) return false; if(pRoot1->val != pRoot2->val) return false; return DoesTree1HaveTree2(pRoot1->left,pRoot2->left) && DoesTree1HaveTree2(pRoot1->right,pRoot2->right); }
晚来天欲雪,能饮一杯无?