zoukankan      html  css  js  c++  java
  • JZ58 对称的二叉树

    对称的二叉树

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

    方法1:递归版本

    func helper(Left, Right *TreeNode) bool {
        if Left == nil && Right== nil {
            return  true
        } else if Left == nil || Right == nil {
            return false
        } else if Left.Val != Right.Val {
            return  false
        }
        return helper(Left.Left,Right.Right) && helper(Left.Right,Right.Left)
    }
    
    func isSymmetrical( pRoot *TreeNode ) bool {
        if pRoot == nil {
            return true
        }   
        return helper(pRoot.Left, pRoot.Right)
    }

    方法2:

    循环版本:
    使用一个栈,分别将左子树的左节点和右子树的右节点压入stack,然后将左子树的右节点和右子树的左节点压入栈。每次循环弹出两个元素看是否相等,是否为空的上面的判断。一定要注意两个都为空的时候要continue,后面压栈的时候需要访问左右节点。不continue的会访问空节点。
     
    func isSymmetrical(pRoot *TreeNode) bool {
        if pRoot == nil {
            return true
        }
        var s []*TreeNode
        p, q := pRoot.Left, pRoot.Right
        s = append(s, p, q)
    
        for len(s) != 0 {
            p = s[len(s)-1]
            s = s[:len(s)-1]
            q = s[len(s)-1]
            s = s[:len(s)-1]
    
            if p == nil && q == nil {
                continue
            }
            if p == nil || q == nil {
                return false 
            }                        
            if p.Val != q.Val {
                return false
            }   
            s = append(s, p.Left, q.Right)    
            s = append(s, p.Right, q.Left) 
        }
        return true
    }
  • 相关阅读:
    每日总结2.26
    《梦断代码》阅读笔记三
    每日总结2.25
    每日总结2.24
    每日总结2.23
    每日总结2.22
    每日总结2.19
    《梦断代码》阅读笔记二
    Java-11 形参和实参
    Java-10 final用法
  • 原文地址:https://www.cnblogs.com/dingxiaoqiang/p/14642642.html
Copyright © 2011-2022 走看看