二叉树层序遍历. - 力扣(LeetCode)
使用bfs进行遍历,将每一层存入一个集合中
java
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
if(root == null)return res;
Queue<TreeNode> q = new LinkedList<>();
q.offer(root);
while(!q.isEmpty()){
List<Integer> list = new ArrayList<>();
//记录本层结点个数
int size = q.size();
//找完本层
for(int i = 0;i < size;i ++){
TreeNode node = q.poll();
list.add(node.val);
if(node.left != null)
q.offer(node.left);
if(node.right != null)
q.offer(node.right);
}
//加入本层
res.add(list);
}
return res;
}
}
二叉树层序遍历(自底向上). - 力扣(LeetCode)
与上一题解法相同,只需要在存入每层数据时,存在最前面的位置。
也可以搜索完之后,进行反转。
java
class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
if(root == null)return res;
Queue<TreeNode> q = new LinkedList<>();
q.offer(root);
while(!q.isEmpty()){
List<Integer> list = new ArrayList<>();
int size = q.size();
for(int i = 0;i < size;i ++){
TreeNode node = q.poll();
list.add(node.val);
if(node.left != null){
q.offer(node.left);
}
if(node.right != null){
q.offer(node.right);
}
}
//将后面层的数据加在结果的最前面,或者进行反转res集合
res.add(0,list);
}
return res;
}
}
二叉树的前序遍历 . - 力扣(LeetCode)
按照头节点、左子节点、右子节点的顺序进行记录,这里使用dfs进行解题
java
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
f(res,root);
return res;
}
public static void f(List<Integer> list,TreeNode node){
if(node == null)return;
//当找到最后一个子节点时,先记录头节点,再次递归,
//当子节点为空时结束,不为空时继续,直到结束
list.add(node.val);
f(list,node.left);
f(list,node.right);
}
}
二叉树的中序遍历. - 力扣(LeetCode)
只需要将f方法进行修改,先记录左子节点,再记录头节点,最后记录右子节点
二叉树的后序遍历 . - 力扣(LeetCode)
只需要将f方法进行修改,先记录右子节点,再记录左子节点,最后记录头节点
java
//中序遍历
public void inorder(TreeNode root, List<Integer> res) {
if (root == null) {
return;
}
inorder(root.left, res);
res.add(root.val);
inorder(root.right, res);
}
//后序遍历
public void postorder(TreeNode root, List<Integer> res) {
if (root == null) {
return;
}
postorder(root.left, res);
postorder(root.right, res);
res.add(root.val);
}