题解 | #对称的二叉树#
对称的二叉树
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; } }