面试题18:树的子结构
题目描述
输入两颗二叉树A,B,判断B是不是A的子结构。
题目分析:
显然是二叉树的遍历,递归的代码比较简洁,面试如果没有特别要求,尽量用递归。
注意指针是否为空的判断,先比较子树A和子树B的根结点是否相同,如果相同,则进步一步比较子树AB的左右子节点是否相同;如果根结点不同,则先判断子树B是否在子树A的左子树中,如果不在子树A的左子树,则再判断子树B是否在子树A的右子树中。
代码如下:
class Solution {
public:
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
bool res = false;
if (pRoot1 && pRoot2) {
if (pRoot1->val == pRoot2->val)
res = CompareTree(pRoot1, pRoot2);
if (!res)
res = HasSubtree(pRoot1->left, pRoot2);
if (!res)
res = HasSubtree(pRoot1->right, pRoot2);
}
return res;
}
/* 递归调用注意函数出口 */
bool CompareTree(TreeNode *root1, TreeNode *root2) {
/* 先判断子树是否为空,因为存在root1和root2同时为空的情况,如果先判断root1则会返回false,错误结果 */
if (root2 == 0)
return true;
if (root1 == 0)
return false;
if (root1->val != root2->val)
return false;
return CompareTree(root1->left, root2->left) && CompareTree(root1->right, root2->right);
}
};