Symmetric Tree——LeetCode

Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).

For example, this binary tree is symmetric:

    1
   / \
  2   2
 / \ / \
3  4 4  3

 

But the following is not:

    1
   / \
  2   2
   \   \
   3    3

 

 题意就是给定一个二叉树,判定它是否是自己的镜像,这道题我一开始想着只求一下中序序列,然后反着求一下中序序列(右、根、左)两个相等即可。WA了之后,我想了下,某些情况还是不对的,一颗二叉树是自己的镜像,意味着基于根对称,那么求出原来的树的中序、后序,再求出镜像的树的中序、后序,比较一下是否相等即可。当然这种方法不是很好,因为要求四次。

Talk is cheap>>

  public boolean isSymmetric(TreeNode root) {
        if (root==null)
            return true;
        return getMidOrderSeq(root).equals(getReMidOrderSeq(root))&&getPostOrderSeq(root).equals(getRePostOrderSeq(root));
    }

    public String getMidOrderSeq(TreeNode node) {
        if (node == null) {
            return "";
        }
        return getMidOrderSeq(node.left) + node.val + getMidOrderSeq(node.right);
    }
    public String getReMidOrderSeq(TreeNode node) {
        if (node == null) {
            return "";
        }
        return getReMidOrderSeq(node.right) + node.val + getReMidOrderSeq(node.left);
    }
    public String getPostOrderSeq(TreeNode node) {
        if (node == null) {
            return "";
        }
        return getPostOrderSeq(node.left) +getPostOrderSeq(node.right)+ node.val ;
    }
    public String getRePostOrderSeq(TreeNode node) {
        if (node == null) {
            return "";
        }
        return getRePostOrderSeq(node.right) +getRePostOrderSeq(node.left)+ node.val ;
    }

第二种方法就是用递归,方法参数为两个TreeNode,如果一个为null,检查另一个是否为null,否则就检查这两个节点值是否相等,并递归检查这两个节点的左右子树。

   public boolean isSymmetric(TreeNode root) {
        if (root == null)
            return true;
        return isSymmetric(root, root);

    }

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

第三种方法就是用栈来代替递归,定义两个栈,一左一右,分别将左节点的左孩子(左栈)、右节点的右孩子(右栈)和左节点的右孩子(左栈)、右节点的左孩子(右栈)入栈,循环不变式是两个栈都非空,然后取出栈顶元素,比较是否相等(都为空或值相等),不等则直接return false;然后再将这两个左右节点的左右孩子入栈。。。

    public boolean isSymmetricIter(TreeNode root) {
            if (root == null || (root.left == null && root.right == null))
                return true;
            Stack<TreeNode> leftStack = new Stack<>();
            Stack<TreeNode> rightStack = new Stack<>();
            leftStack.push(root.left);
            rightStack.push(root.right);
            while (!leftStack.isEmpty() && !rightStack.isEmpty()) {
                TreeNode left = leftStack.pop();
                TreeNode right = rightStack.pop();
                if (left == null && right == null) {
                    continue;
                }
                if (left == null || right == null)
                    return false;
                if (left.val != right.val)
                    return false;
                leftStack.push(left.left);
                rightStack.push(right.right);
                leftStack.push(left.right);
                rightStack.push(right.left);
            }
            return true;
        }

 

转载于:https://www.cnblogs.com/aboutblank/p/4357705.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值