• 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;
        }
  • 相关阅读:
    Ubuntu下OpenCV的安装和QT调用openCV库的方法
    VC维含义的个人理解
    红黑树的学习笔记
    Linux下Matlab的安装和中文显示支持
    《Python学习手册》读书笔记
    稀疏图上的Johnson算法
    利用隐藏神经元解决异或问题的小型示例程序
    gdb调试命令
    MATLAB生成正态样本以及正态矩阵、从文件读入矩阵
    Python遍历路径下文件并转换成UTF8编码
  • 原文地址:https://www.cnblogs.com/skillking/p/9718375.html
Copyright © 2020-2023  润新知