皮皮的LeetCode刷题库

【剑指Offer】058——对称的二叉树 (树)

2019-08-22  本文已影响0人  就问皮不皮

题目描述

请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。

解题思路

二叉树的镜像看参见题目:18、二叉树的镜像

法一:递归。根节点的左右子树相同,左子树的左子树和右子树的右子树相同,左子树的右子树和右子树的左子树相同即可。
法二:非递归。非递归也是一样,采用栈或队列存取各级子树根节点。

参考代码

Java

import java.util.Stack;
class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
    public TreeNode(int val) {
        this.val = val;
    }
}

public class Solution {
    // 递归法
    boolean isSymmetrical(TreeNode pRoot) {
        if(pRoot == null)
            return true;
        return isSymmetrical(pRoot.left, pRoot.right);
    }
    boolean isSymmetrical(TreeNode left, TreeNode right){
        if(left == null && right == null)
            return true;
        if(left == null || right == null)
            return false;
        // 当两个结点的值相同时
        if(left.val == right.val){
            // 判断左的左 与 右的右是否相同;以及左的右与右的左是否相同
            return isSymmetrical(left.left, right.right) &&
                    isSymmetrical(left.right, right.left);
        }
        return false;
    }
    // 非递归法
    boolean isSymmetrical2(TreeNode pRoot) {
        if (pRoot == null) return true;
        Stack<TreeNode> s = new Stack<TreeNode>();
        s.push(pRoot.left); // 左子树压栈
        s.push(pRoot.right) // 右子树压栈
        while (!s.isEmpty()){
            TreeNode right = s.pop(); // 弹出栈
            TreeNode left = s.pop();  // 弹出栈
            if (right == null && left == null) continue;
            if (right == null || left == null) return false; // 不对称
            if (right.val != left.val) return false; // 不对称
            s.push(left.left);
            s.push(right.right);
            s.push(left.right);
            s.push(right.left);
        }
        return true;
    }
}

Python

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def isSymmetrical(self, pRoot):
        # write code here
        if not pRoot:return True
        s = [pRoot.left, pRoot.right]
        while len(s) > 0:
            right = s.pop()
            left = s.pop()
            if not right and not left:continue
            if not right or not left:return False
            if right.val != left.val:return False
            s.append(left.left)
            s.append(right.right)
            s.append(left.right)
            s.append(right.left)
        return True

个人订阅号

image
上一篇 下一篇

猜你喜欢

热点阅读