题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
思路分析
非递归做法
根据对称的定义,我们可以将二叉树通过层次遍历转换为数组进行比较,分别为从左到右和从右到左遍历,null结点也需记录,最后遍历比较两个数组的元素。
递归做法
根据对称的定义,需要检验左右结点的值是否相等且对称的子树也相等。此方法的具体实现,可以参照牛客的解答区,全都是递归方法。
代码实现
public static boolean isSymmetrical(TreeNode pRoot)
{
ArrayList<TreeNode> arrayListLeft = printTopToBottom(pRoot,1);
ArrayList<TreeNode> arrayListRight = printTopToBottom(pRoot,0);
if(arrayListLeft.size()!=arrayListRight.size()){
return false;
}
for (int i = 0; i < arrayListLeft.size(); i++) {
if(arrayListLeft.get(i).val!=arrayListRight.get(i).val){
return false;
}
}
return true;
}
/**
* 层次遍历
* @param pNode
* @return
*/
public static ArrayList<TreeNode> printTopToBottom(TreeNode pNode, int flag){
Queue<TreeNode> queue = new LinkedList<>();
ArrayList<TreeNode> arrayList = new ArrayList<>();
queue.add(pNode);
while (!queue.isEmpty()){
int count = queue.size();
while (count-->0){
TreeNode node = queue.poll();
if(node==null){
arrayList.add(new TreeNode(0));
continue;
}
arrayList.add(node);
if (flag==1){
queue.offer(node.left);
queue.offer(node.right);
}else {
queue.offer(node.right);
queue.offer(node.left);
}
}
}
return arrayList;
}