zoukankan      html  css  js  c++  java
  • 101. Symmetric Tree

    一、题目

      1、审题

      2、分析

        给出一棵二叉树,判断其是否对称。

    二、解答

      1、思路:

        方法一、

          每次递归判断根节点的左孩子与根节点的右孩子是否相等。

      

    public boolean isSymmetric(TreeNode root) {
            if(root == null)
                return true;
            return isSymmetric(root.left, root.right);
        }
    
        
        private boolean isSymmetric(TreeNode left, TreeNode right) {
            
            if(left == null && right == null)
                return true;
            if(left == null || right == null)
                return false;
            
            return left.val == right.val && (isSymmetric(left.right, right.left))
                                         && (isSymmetric(left.left, right.right));
        }

      

      方法二、

        新建一个栈空间,根节点的左孩子与根节点的右孩子同时入栈,出栈时出两个栈顶元素,判断其值是否相等。

        若相等,在入根左孩子的左孩子与根右孩子的右孩子,在入栈根左孩子的右孩子与根右孩子的左孩子。

        若栈不为空,再出两个栈顶元素进行判断。

     public boolean isSymmetric(TreeNode root) {
            if(root == null)
                return true;
            
            Stack<TreeNode> stack = new Stack<>();
            TreeNode left, right;
            
            if(root.left != null) {
                if(root.right == null)
                    return false;
                stack.push(root.left);
                stack.push(root.right);
            }
            else if(root.right != null)
                return false;
            
            while(!stack.isEmpty()) {
                if(stack.size() % 2 != 0)
                    return false;
                
                right = stack.pop();
                left = stack.pop();
                if(right.val != left.val)
                    return false;
                
                if(left.left != null) {
                    if(right.right == null)
                        return false;
                    stack.push(left.left);
                    stack.push(right.right);
                }
                else if(right.right != null)
                    return false;
                
                if(left.right != null) {
                    if(right.left == null)
                        return false;
                    stack.push(left.right);
                    stack.push(right.left);
                }
                else if(right.left != null)
                    return false;
            }
            
            return true;
        }
  • 相关阅读:
    C#使用枚举方法来实现读取用户电脑中安装的软件
    C#实现窗体阴影效果
    [转]SQLserver字符串分割函数
    [转]WinForm实现win7 Aero磨砂效果介绍
    C#通过鼠标点击panel移动来控制无边框窗体移动
    [转]Table交替行变色 鼠标经过变色 单击变色
    《面向对象程序设计》 三 Calculator 计算器初步
    PAT 1001A+B Format
    大一下学期的自我目标
    《面向对象程序设计》第二次作业
  • 原文地址:https://www.cnblogs.com/skillking/p/9718375.html
Copyright © 2011-2022 走看看