题解 | #对称的二叉树#
对称的二叉树
http://www.nowcoder.com/practice/ff05d44dfdb04e1d83bdbdab320efbcb
层序遍历即可
1、 如果有左子树、层序遍历左子树
2、如果右子树、逆向层序遍历右子树
3、层序遍历时注意 空的叶子节点(度为1的结点的空孩子节点),用0替换;
4、比较两个树
import java.util.*;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
boolean isSymmetrical(TreeNode pRoot) {
if(pRoot==null){
return true;
}
ArrayList<Integer> arrayLeft = new ArrayList();
ArrayList<Integer> arrayRight = new ArrayList();
// 如果有左子树
if(pRoot.left!=null){
arrayLeft = layerEG(pRoot.left);
}
//层序遍历左子树
//如果右子树
if(pRoot.right!=null){
arrayRight = RlayerEG(pRoot.right);
}
//逆向层序遍历右子树
//比较两个树
if(Arrays.equals(arrayLeft.toArray(),arrayRight.toArray())){
return true;
}
return false;
}
public ArrayList layerEG(TreeNode node){
Stack<TreeNode> que = new Stack();
ArrayList<Integer> array = new ArrayList();
TreeNode temp;
que.add(node);
while(que.size()!=0){
temp = que.pop();
if(temp!=null){
array.add(temp.val);
if(temp.left!=null){
que.add(temp.left);
}else{
que.add(null);;//特别注意:层序遍历 叶子节点 相等元素 非对称 左右节点
}
if(temp.right!=null){
que.add(temp.right);
}else{
que.add(null);
}
}else {
array.add(0);//空的叶子节点 用0占位
}
}
return array;
}
public ArrayList RlayerEG(TreeNode node){
Stack<TreeNode> que = new Stack();
ArrayList<Integer> array = new ArrayList();
TreeNode temp;
que.add(node);
while(que.size()!=0){
temp = que.pop();
if(temp!=null){
array.add(temp.val);
if(temp.right!=null){
que.add(temp.right);
}else{
que.add(null);
}
if(temp.left!=null){
que.add(temp.left);
}else{
que.add(null);
}
}else{
array.add(0);
}
}
return array;
}
}
