卡哥给了十道题。。都是二叉树bfs算法的相关应用,由于!时间问题!我就先写了第一道纯遍历题。
102.二叉树层序遍历
给你二叉树的根节点
root
,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
解题思路:
①定义队列que存放结点,List<List>存放遍历结果集。
②将头结点加入队列。
③循环遍历队列(每一层)。while(!que.isEmpty())
④定义size为当前层数的节点个数。遍历每个节点。for(int i=0;i<size;i++)
⑤定义node存放当前遍历的结点,将该节点弹出队列并存放在List中。
⑤判断该结点是否有左右孩子,若有加入到队列中。
⑥遍历完当前层后,将存放该层结点的List加入到List<List>中
⑦返回List<List>
注意:遍历每一层结点时,循环终止条件必须是常量size!不能是变量que.size()!que的大小是每次都会变化的!
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> resList = new ArrayList<List<Integer>>();
if(root==null) return resList ;
Queue<TreeNode> que=new LinkedList<>();
que.offer(root);
while(!que.isEmpty()){
int size=que.size();
List<Integer> list=new ArrayList<>();
for(int i=0;i<size;i++){
TreeNode node = que.poll();
list.add(node.val);
if(node.left!=null){que.offer(node.left);}
if(node.right!=null){que.offer(node.right);}
}
resList.add(list);
}
return resList;
}
}
226.反转二叉树
给你一棵二叉树的根节点
root
,翻转这棵二叉树,并返回其根节点。输入:root = [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1]
本题用递归解决问题,前后序遍历只需交换节点顺序即可。
中序遍历由于先遍历交换了左子树,此时的左子树已经变为了右子树。因此需要再交换左子树。其实为(左中左)顺序完成交换。
我一开始自己写swap函数时,直接将root的左右孩子作为参数传递,但结果并没有进行交换。
后来提问了之后知道了直接将left,right节点进行交换的话只是改变了左右节点,但对于它们父节点parent的left和right引用并没有改变!所以还是要传入父节点然后改变左右节点。
错误代码:
正确:
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root==null){return root;}
swap(root);
invertTree(root.left);
invertTree(root.right);
return root;
}
public void swap(TreeNode node){
TreeNode temp=node.left;
node.left=node.right;
node.right=temp;
}
}
101. 对称二叉树
给你一个二叉树的根节点
root
, 检查它是否轴对称。
本题使用递归实现。
①首先判断左右节点空指针是否对称,不对称直接返回false。
②排除空指针后,判断左右节点数值是否相等。
③递归调用,判断左右子树外侧数值是否相等(left.left && right.right)
④递归调用,判断左右字数内侧数值是否相等(left.right && right.left)
⑤最后返回内外侧判断结果的值即可。
注意:本题只能使用后序(左右/右左 中都可以)遍历,因为前/中序遍历没有对左右子树比较完毕就进行返回。
class Solution {
public boolean isSymmetric(TreeNode root) {
return compare(root.left,root.right);
}
public boolean compare(TreeNode left,TreeNode right){
if(left==null&&right==null){return true;}
else if(left==null&&right!=null){return false;}
else if(left!=null&&right==null){return false;}
else if(left.val!=right.val){return false;}
boolean out=compare(left.left,right.right); //左
boolean in=compare(left.right,right.left); //右
return out&∈ //中
}
}