面试题18:树的子结构

面试题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);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值