您的位置:首页 > 其它

leetcode - 101. Symmetric Tree

2018-01-28 20:45 453 查看
Problem:

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

 For example, this binary tree 
[1,2,2,3,4,4,3]
 is
symmetric:
1
/ \
2   2
/ \ / \
3  4 4  3


 But the following 
[1,2,2,null,3,null,3]
 is
not:

1
/ \
2   2
\   \
3    3


Note:

Bonus points if you could solve it both recursively and iteratively.
解释:给定一个树,判断这棵树是否是沿着中间对称(数值)。(用递归和非递归解决。)
Solve:
1.emm 想了很久写了个非递归的,就是沿着树逐层读取,判断这一层是否中心对称。(时间复杂度O(n^n),AC-152ms
这个AC时间真的炸了,排最后算是。不过前面快的都是递归。不知道非递归的其他时间怎么样。贴代码:

public static int getMaxDepth(TreeNode root) {//获取树的深度
if (root == null){
return 0;
} else {
int left = getMaxDepth(root.left);
int right = getMaxDepth(root.right);
return 1 + Math.max(left, right);
}
}

public static boolean isSymmetric(TreeNode root) {
ArrayList<ArrayList<TreeNode>> arrayLists=new ArrayList<>();//大集合保存所有层(每个小集合)
ArrayList<TreeNode> TarrayList=new ArrayList<>();//小集合保存每一层的所有结点
TarrayList.add(root);//先储存根结点
arrayLists.add(TarrayList);
int depth=getMaxDepth(root);//求树的深度
for(int i=0;i<depth-1;i++){//逐层遍历
ArrayList<TreeNode> TempTarrayList=new ArrayList<>();//用于保存这一层所有的结点
for(int j=0;j<arrayLists.get(i).size();j++){//对上一层的所有结点进行遍历,得到这一层的结点(父结点 得到 子结点)
if(arrayLists.get(i).get(j)==null){//父节点为空,仍要生成两个空的子结点,
TempTarrayList.add(null);
TempTarrayList.add(null);
}else {
TempTarrayList.add(arrayLists.get(i).get(j).left);
TempTarrayList.add(arrayLists.get(i).get(j).right);
}
}
arrayLists.add(TempTarrayList);

for (int j = 0; j <TempTarrayList.size()/2; j++) {//判断这一层结点是否中间对称
if(TempTarrayList.get(j)!=null&&TempTarrayList.get((int)Math.pow(2,i+1)-j-1)!=null){//结点非空,
if(TempTarrayList.get(j).val!=TempTarrayList.get((int)Math.pow(2,i+1)-j-1).val) {//判断数值是否相同
return false;
}
}else if(TempTarrayList.get(j)==null&&TempTarrayList.get((int)Math.pow(2,i+1)-j-1)==null){//结点都为空的情况 不用判断,等同于数值相同的情况

}else {//其他情况 如两个相对称的结点 :左结点空 右结点非空 该树不对称
return false;
}
}
}
return true;
}


2.搬运个递归的算法:看完才恍然大悟。

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

private boolean isSymmetric(TreeNode left, TreeNode right) {
int nu = (left == null ? 1 : 0) + (right == null ? 1 : 0);
if (nu == 1)
return false;
if (nu == 2)
return true;
return left.val == right.val && isSymmetric(left.left, right.right) && isSymmetric(left.right, right.left);
}


后记:看来我要好好学下递归了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: