剑指offer——树的子结构

    xiaoxiao2022-07-14  161

    题目描述 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

    链接:https://www.nowcoder.com/questionTerminal/6e196c44c7004d15b1610b9afca8bd88 来源:牛客网

    先说下算法实现思路:对于两棵二叉树来说,要判断B是不是A的子结构,首先第一步在树A中查找与B根节点的值一样的节点。

    通常对于查找树中某一个节点,我们都是采用递归的方法来遍历整棵树。

    第二步就是判断树A中以R为根节点的子树是不是和树B具有相同的结构。

    这里同样利用到了递归的方法,如果节点R的值和树的根节点不相同,则以R为根节点的子树和树B肯定不具有相同的节点;

    如果它们值是相同的,则递归的判断各自的左右节点的值是不是相同。

    递归的终止条件是我们达到了树A或者树B的叶节点。

    有地方要重点注意,DoesTree1haveTree2()函数中的两个 if 判断语句 不能颠倒顺序 。 因为如果颠倒了顺序,会先判断pRoot1 是否为None, 其实这个时候,pRoot1 的节点已经遍历完成确认相等了,但是这个时候会返回 False,判断错误。

    /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Solution { bool doseTree1HaveTree2(TreeNode* pRoot1, TreeNode* pRoot2){ if(!pRoot2) return true; if(!pRoot1) return false; if(pRoot1->val != pRoot2->val) return false; return doseTree1HaveTree2(pRoot1->left, pRoot2->left) && doseTree1HaveTree2(pRoot1->right, pRoot2->right); } public: bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) { if(!pRoot1 || !pRoot2) return false; bool result = false; if(pRoot1->val == pRoot2->val) { result = doseTree1HaveTree2(pRoot1, pRoot2); } if(!result) { result = HasSubtree(pRoot1->left, pRoot2); } if(!result) { result = HasSubtree(pRoot1->right, pRoot2); } return result; } };
    最新回复(0)