前言
这道题可以说是很经典的二叉树的题目,题解大都给的是使用后序遍历来解决,以下我使用中序遍历也对其进行了解决,虽然效率不高但是也是一种拓展思维的方式。
101. 对称二叉树
给你一个二叉树的根节点 root , 检查它是否轴对称。
示例 1:
输入:root = [1,2,2,3,4,4,3]
输出:true
示例 2:
输入:root = [1,2,2,null,3,null,3]
输出:false
个人思路
先将树进行填充,中序遍历将结果入队,然后右中左遍历挨个消除队列元素,最后判断队列是否为空。上代码:
class Solution {
Deque<Integer> que=new LinkedList<>();
public boolean isSymmetric(TreeNode root) {
/*
补充树,将左子树存在但是右子树为null,右子树存在左子树为空的节点的为null的子树进行
补充。
*/
add(root);
// 中序遍历,将结果放入到队列中
midOrder(root);
// 右左中遍历树,每个遍历到的节点和队列首位进行比较,如果相等则出队
mid2Order(root);
return que.isEmpty();
}
// 填充树
public void add(TreeNode root){
Deque<TreeNode> tree=new LinkedList<>();
tree.offer(root);
int layer=1; //加上一个每一层的标志
while(!tree.isEmpty()){
int size=tree.size();
List<Integer> path=new ArrayList<>();
for(int i=0;i<size;i++){
TreeNode temp=tree.poll();
path.add(temp.val);
if(temp.left!=null)
tree.offer(temp.left);
else if(temp.left==null && temp.right!=null)
temp.left=new TreeNode(101*layer);
if(temp.right!=null)
tree.offer(temp.right);
else if(temp.right==null && temp.left!=null)
temp.right=new TreeNode(101*layer);
}
layer++;
}
}
// 左中右 中序遍历
public void midOrder(TreeNode node){
if(node==null)
return;
midOrder(node.left);
que.offer(node.val);
midOrder(node.right);
}
// 右中左
public void mid2Order(TreeNode node){
if(node==null)
return;
mid2Order(node.right);
if(que.peek()==node.val)
que.poll();
mid2Order(node.left);
}
}