【算法题】对称的二叉树

对称的二叉树

https://www.nowcoder.com/practice/ff05d44dfdb04e1d83bdbdab320efbcb?tpId=196&tqId=37058&rp=1&sourceUrl=%2Fexam%2Foj&difficulty=undefined&judgeStatus=undefined&tags=&title=

这题让判断二叉树是否对称,如果只有一个节点是没法判断的,所以根节点不需要判断,只需要判断两个子节点的值是否相等,但子节点的子节点也需要判断,我们可以使用递归的方式,判断的原则是:

  • 左子节点的左子节点和右子节点的右子节点比较。
  • 左子节点的右子节点和右子节点的左子节点比较。

如下图所示:

alt

    public boolean isSymmetrical(TreeNode pRoot) {
        if (pRoot == null)
            return true;
        // 从两个子节点开始判断
        return dfs(pRoot.left, pRoot.right);
    }

    private boolean dfs(TreeNode left, TreeNode right) {
        // 两个节点都为空,返回true
        if (left == null && right == null)
            return true;
        // 如果当前节点只有一个子节点或者有两个子节点,但两个子节点的值不相同,直接返回false
        if (left == null || right == null || left.val != right.val)
            return false;
        // 左子节点的左子节点和右子节点的右子节点比较,左子节点的右子节点和右子节点的左子节点比较
        return dfs(left.left, right.right) && dfs(left.right, right.left);
    }

public:
    bool isSymmetrical(TreeNode *pRoot) {
        if (pRoot == nullptr)
            return true;
        // 从两个子节点开始判断
        return dfs(pRoot->left, pRoot->right);
    }

    bool dfs(TreeNode *left, TreeNode *right) {
        // 两个节点都为空,返回true
        if (left == nullptr && right == nullptr)
            return true;
        // 如果当前节点只有一个子节点或者有两个子节点,但两个子节点的值不相同,直接返回false
        if (left == nullptr || right == nullptr || left->val != right->val)
            return false;
        // 左子节点的左子节点和右子节点的右子节点比较,左子节点的右子节点和右子节点的左子节点比较
        return dfs(left->left, right->right) && dfs(left->right, right->left);
    }

各大厂算法面试题已经整理好了,请看这里:《算法专栏》

#笔试#

为了应对春招和秋招找工作,我经过长时间的收集和整理了各大厂的算法面试题,所有的算法题我都已经做了实现,大家可以根据自己需要面试的大厂选择练习即可。适宜人群: 在校生、社招求职者及自学者。

全部评论

相关推荐

03-05 12:52
吉林大学 Java
挣K存W养DOG:他的价值在于把他家里积攒的财富回馈给社会
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务