层序遍历
题目
思路
使用队列来进行遍历,当前队列保存的是当前层的所有节点,依次取出队列顶端的节点,将该节点的左右子节点加入到队列尾端。
代码
public List<List<Integer>> levelOrder(Node root) {
// 层序遍历n叉树
List<List<Integer>> out = new ArrayList<>();
Queue<Node> queue = new ArrayDeque<>();
if(root == null){
return out;
}
queue.add(root);
while (!queue.isEmpty()){
int len = queue.size();
List<Integer> temp_list = new ArrayList<>();
while (len > 0 ){
Node temp = queue.poll();
temp_list.add(temp.val);
len--;
for(int i = 0; i < temp.children.size(); i++){
if(temp.children.get(i) != null){
queue.add(temp.children.get(i));
}
}
}
out.add(temp_list);
}
return out;
}
翻转二叉树
题目
思路
将翻转二叉树划分为翻转每个节点的子问题,对每个节点,都使用一个temp节点来辅助其左右节点进行交换。
代码
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root == null){return root;}
Queue<TreeNode> queue = new ArrayDeque<TreeNode>();
queue.add(root);
while (!queue.isEmpty()){
int len = queue.size();
while (len > 0){
TreeNode temp = queue.poll();
if(temp.left != null){queue.add(temp.left);}
if(temp.right != null){queue.add(temp.right);}
invert(temp);
len --;
}
}
return root;
}
public TreeNode invert(TreeNode root){
if(root.right == null && root.left == null){
return null;
}
TreeNode temp = new TreeNode();
// 使用temp来将左右节点进行交换
temp = root.left;
root.left = root.right;
root.right = temp;
return root;
}
}