LeetCode 154题:Symmetric Tree

来源:互联网 发布:怎么判断端口是否连通 编辑:程序博客网 时间:2024/05/21 07:05

原题目:

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
原创粉丝点击