美文网首页皮皮的LeetCode刷题库
【剑指Offer】058——对称的二叉树 (树)

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

作者: 就问皮不皮 | 来源:发表于2019-08-22 12:53 被阅读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

    相关文章

      网友评论

        本文标题:【剑指Offer】058——对称的二叉树 (树)

        本文链接:https://www.haomeiwen.com/subject/fllnsctx.html