LeetCode 154题:Symmetric Tree

原题目

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

Note:
Bonus points if you could solve it both recursively and iteratively.

解决办法:

第一反应是想中序遍历,比如说Symmetric Tree的中序遍历结果肯定是一个对称的字符串(3241423),显然这个过程是不可逆的,后来想如果还提供树的高度可不可以可逆,画了一下发现是不行,比如说下面这个过程:

    1                                                        1
   / \                                                      / \
  2   2         ==>        32123         ==>               3   2
 /     \                                                    \   \
3       3                                                    2   3

还是老老实实递归好了,代码如下:

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(null == root)
            return true;
        return isSymmetric(root.left, root.right);
    }
    
    private boolean isSymmetric(TreeNode leftOne, TreeNode rightOne) {
        if(leftOne == null && rightOne == null)
            return true;
        if((leftOne == null && rightOne != null) || (leftOne != null && rightOne == null))
            return false;
        return isSymmetric(leftOne.left, rightOne.right) && isSymmetric(leftOne.right, rightOne.left) && leftOne.val == rightOne.val; 
    }
}

既然递归实现了,那么循环加栈就简单了:

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(null == root)
            return true;
        if(root.left == null || root.right == null)
            return root.left == null && root.right == null;
        Stack<TreeNode> treeNodes = new Stack<TreeNode>();
        treeNodes.push(root.left);
        treeNodes.push(root.right);
        while(treeNodes.size() > 0) {
            TreeNode right = treeNodes.pop();
            TreeNode left = treeNodes.pop();
            if((left == null && right != null) || (left != null && right == null))
                return false;
            if(left != null && right != null) {
                if(left.val != right.val)
                    return false;
                treeNodes.push(left.left);
                treeNodes.push(right.right);
                treeNodes.push(left.right);
                treeNodes.push(right.left);
            }
        }
        return true;
    }
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值