(剑指Offer)面试题18:树的子结构
题目:
输入两棵二叉树A和B,判断B是不是A的子结构。
二叉树结构定义如下:
struct TreeNode{ int val; TreeNode* left; TreeNode* right; };
思路:
判断二叉树B是否为二叉树A的子树:
首先判断二叉树A的根节点值是否等于二叉树B的根节点值;
如果是,则继续往下遍历,判断二叉树A的左子节点和二叉树B的左子结点以及二叉树A的右子节点和二叉树B的右子节点是否都相等,直到叶子节点;(递归)
return IsSubtree(pRoot1->left,pRoot2->left) && IsSubtree(pRoot1->right,pRoot2->right);
如果不是,则判断二叉树B是否为二叉树A左子树的子树或者二叉树B是否为二叉树A右子树的子树;(递归)
result=HasSubtree(pRoot1->left,pRoot2);
result=HasSubtree(pRoot1->right,pRoot2);
代码:
struct TreeNode{ int val; TreeNode* left; TreeNode* right; }; bool IsSubtree(TreeNode* pRoot1,TreeNode* pRoot2){ if(pRoot2==NULL) return true; if(pRoot1==NULL) return false; if(pRoot1->val!=pRoot2->val) return false; return IsSubtree(pRoot1->left,pRoot2->left) && IsSubtree(pRoot1->right,pRoot2->right); } bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2){ bool result=false; if(pRoot1!=NULL && pRoot2!=NULL){ if(pRoot1->val==pRoot2->val) result=IsSubtree(pRoot1,pRoot2); if(!result) result=HasSubtree(pRoot1->left,pRoot2); if(!result) result=HasSubtree(pRoot1->right,pRoot2); } return result; }
在线测试OJ:
http://www.nowcoder.com/books/coding-interviews/6e196c44c7004d15b1610b9afca8bd88?rp=1
AC代码:
class Solution { public: bool IsSubtree(TreeNode* pRoot1,TreeNode* pRoot2){ if(pRoot2==NULL) return true; if(pRoot1==NULL) return false; if(pRoot1->val!=pRoot2->val) return false; return IsSubtree(pRoot1->left,pRoot2->left) && IsSubtree(pRoot1->right,pRoot2->right); } bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) { bool result=false; if(pRoot1!=NULL && pRoot2!=NULL){ if(pRoot1->val==pRoot2->val) result=IsSubtree(pRoot1,pRoot2); if(!result) result=HasSubtree(pRoot1->left,pRoot2); if(!result) result=HasSubtree(pRoot1->right,pRoot2); } return result; } };