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
}
原文地址:https://www.cnblogs.com/dingxiaoqiang/p/14642642.html