JZ58-对称的二叉树

对称的二叉树

https://www.nowcoder.com/practice/ff05d44dfdb04e1d83bdbdab320efbcb?tpId=13&tags=&title=&diffculty=0&judgeStatus=0&rp=1&tab=answerKey

class Solution {
    boolean isSymmetrical(TreeNode pRoot) {
        if (pRoot == null) {
            return true;
        }
        return isSame(pRoot.left, pRoot.right);
    }

    boolean isSame(TreeNode lRoot, TreeNode rRoot) {
        if (lRoot == null && rRoot == null) {
            return true;
        }
        if (lRoot == null || rRoot == null) { //只要有任意一个为非空
            return false;
        }
        if (lRoot.val != rRoot.val) {
            return false;
        }
        return isSame(lRoot.left, rRoot.right) && isSame(lRoot.right, rRoot.left);
    }
}

/**
 * 分享一种非递归算法,主要思路是:设置两个链表,分别代表左子树和右子树。
 * 左子树每次都从左往右添加节点,右子树每次都从右往左添加节点。
 */
class Solution2 {
    boolean isSymmetrical(TreeNode pRoot) {
        if (pRoot == null)
            return true;
        LinkedList<TreeNode> leftList = new LinkedList<>();
        LinkedList<TreeNode> rightList = new LinkedList<>();

        leftList.add(pRoot.left);
        rightList.add(pRoot.right);

        while (!leftList.isEmpty() && !rightList.isEmpty()) {
            TreeNode leftNode = leftList.poll();
            TreeNode rightNode = rightList.poll();
            if (leftNode == null && rightNode == null)
                continue;
            if (leftNode == null || rightNode == null)
                return false;
            if (leftNode.val != rightNode.val)
                return false;
            // 左子树从左往右添加节点
            leftList.add(leftNode.left);
            leftList.add(leftNode.right);
            // 右子树从右往左添加节点
            rightList.add(rightNode.right);
            rightList.add(rightNode.left);
        }
        return leftList.isEmpty() && rightList.isEmpty();
    }
}

全部评论

相关推荐

VirtualBool:都去逗他了?
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
05-21 00:27
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务