遍历系列
144. 二叉树的前序遍历
题目描述:
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
示例 1:
示例 2:
输入:root = []
输出:[]
示例 3:
输入:root = [1]
输出:[1]
示例 4:
示例 5:
提示:
树中节点数目在范围 [0, 100] 内
-100 <= Node.val <= 100
进阶:递归算法很简单,你可以通过迭代算法完成吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-preorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
//递归
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> arr = new ArrayList<Integer>();
preorder(root, arr);
return arr;
}
public void preorder(TreeNode root, List<Integer> arr) {
if (root == null) return;
arr.add(root.val);
preorder(root.left, arr);
preorder(root.right, arr);
}
}
//迭代:写法一
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> arr = new ArrayList<Integer>();
if (root == null) return arr;
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode cur = root;
while (!stack.isEmpty() || cur != null) {
while (cur != null) {
arr.add(cur.val);
stack.push(cur);
cur = cur.left;
}
cur = stack.pop();
cur = cur.right;
}
return arr;
}
}
//迭代:写法二
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
while (root! = null || !stack.isEmpty()) {
if (root != null) {
list.add(root.val);//步骤一,取根节点的值
stack.push(root);//把根节点放入栈中
root = root.left;//步骤二,遍历左子树
} else {
TreeNode tem = stack.pop();
root = tem.right;//步骤三,遍历右子树
}
}
return list;
}
}
//迭代:写法三
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> arr = new ArrayList<>();
if (root == null) return arr;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while (!stack.isEmpty()) {
TreeNode cur = stack.pop();
arr.add(cur.val);
if (cur.right != null) {
stack.push(cur.right);
}
if (cur.left != null) {
stack.push(cur.left);
}
}
return arr;
}
}
94. 二叉树的中序遍历
题目描述:
给定一个二叉树的根节点 root ,返回它的 中序 遍历。
示例 1:
示例 2:
输入:root = []
输出:[]
示例 3:
输入:root = [1]
输出:[1]
示例 4:
示例 5:
提示:
树中节点数目在范围 [0, 100] 内
-100 <= Node.val <= 100
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-inorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
//递归
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> arr = new ArrayList<>();
inorder(root, arr);
return arr;
}
public void inorder(TreeNode root, List<Integer> arr) {
if (root == null) return;
inorder(root.left, arr);
arr.add(root.val);
inorder(root.right, arr);
}
}
//迭代:写法一
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> arr = new ArrayList<>();
if (root == null) return arr;
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
while (!stack.isEmpty() || cur != null) {
while (cur != null) {
stack.push(cur);
cur = cur.left;
}
cur = stack.pop();
arr.add(cur.val);
cur = cur.right;
}
return arr;
}
}
//迭代:写法二
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
Stack<TreeNode> stack =n ew Stack<>();
while (root != null || !stack.isEmpty()) {
if (root != null) {
stack.push(root);//把根节点放入栈中
root=root.left;//步骤一,遍历左子树
} else {
TreeNode tem = stack.pop();
list.add(tem.val);//步骤二,取根结点的值
root = tem.right;//步骤三,遍历右子树
}
}
return list;
}
}
145. 二叉树的后序遍历
题目描述:
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-inorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
//递归
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> arr = new ArrayList<>();
postorder(root, arr);
return arr;
}
public void postorder(TreeNode root, List<Integer> arr) {
if (root == null) return;
postorder(root.left, arr);
postorder(root.right, arr);
arr.add(root.val);
}
}
//迭代:写法一
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
if (root == null) return res;
Deque<TreeNode> stack = new LinkedList<TreeNode>();
TreeNode prev = null;
while (root != null || !stack.isEmpty()) {
while (root != null) {
stack.push(root);
root = root.left;
}
root = stack.pop();
if (root.right == null || root.right == prev) {
res.add(root.val);
prev = root;
root = null;
} else {
stack.push(root);
root = root.right;
}
}
return res;
}
}
//迭代法:写法二
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
while (root != null || !stack.isEmpty()) {
if (root != null) {
stack.push(root);//把根节点放入栈中
list.add(0, root.val);//步骤一,在index=0处插入根结点的值
root = root.right;//步骤二,遍历右子树
} else {
TreeNode tem = stack.pop();
root = tem.left;//步骤三,遍历左子树
}
}
return list;
}
}
DFS 遍历使用递归:
void DFS(TreeNode root) {
if (root == null) return;
DFS(root.left);
DFS(root.right);
}
BFS 遍历使用队列数据结构:
void BFS(TreeNode root) {
Queue<TreeNode> queue = new ArrayDeque<>();
queue.offer(root);
while (!queue.isEmpty()) {
TreeNode cur = queue.poll();
if (cur.left != null)
queue.offer(cur.left);
if (cur.right != null)
queue.offer(cur.right);
}
}
102. 二叉树的层序遍历
题目描述:
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> arr = new ArrayList<List<Integer>>();
if (root == null) return arr;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);
while (!queue.isEmpty()) {
List<Integer> ans = new ArrayList<Integer>();;
int n = queue.size();
for (int i = 0; i < n; i++) {
TreeNode cur = queue.poll();
ans.add(cur.val);
if (cur.left != null) {
queue.offer(cur.left);
}
if (cur.right != null) {
queue.offer(cur.right);
}
}
arr.add(ans);
}
return arr;
}
}
103. 二叉树的锯齿形层序遍历
题目描述:
给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7],
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-zigzag-level-order-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> arr = new LinkedList<List<Integer>>();
if (root == null) return arr;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);
boolean leftToRight = true;
while (!queue.isEmpty()) {
Deque<Integer> deque = new LinkedList<Integer>();
int len = queue.size();
for (int i = 0; i < len; i++) {
TreeNode node = queue.poll();
if (leftToRight) {
deque.offerLast(node.val);
} else {
deque.offerFirst(node.val);
}
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
arr.add(new LinkedList<Integer>(deque));
leftToRight = !leftToRight;
}
return arr;
}
}
107. 二叉树的层序遍历 II
题目描述:
给定一个二叉树,返回其节点值自底向上的层序遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
例如:
给定二叉树 [3,9,20,null,null,15,7],
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
//
//将二叉树结点插入到队列的首位, 对应最后输出
class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
LinkedList<List<Integer>> arr = new LinkedList<List<Integer>>();
if (root == null) return arr;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);
while (!queue.isEmpty()) {
List<Integer> ans = new LinkedList<Integer>();
int len = queue.size();
for (int i = 0; i < len; i++) {
TreeNode cur = queue.poll();
ans.add(cur.val);
if (cur.left != null) {
queue.offer(cur.left);
}
if (cur.right != null) {
queue.offer(cur.right);
}
}
arr.addFirst(ans);
}
return arr;
}
}
//还可以写成这样, arr.addFirst(ans) 相当于arr.add(0, ans)
class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> arr = new LinkedList<List<Integer>>();
if (root == null) return arr;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);
while (!queue.isEmpty()) {
List<Integer> ans = new LinkedList<Integer>();
int len = queue.size();
for (int i = 0; i < len; i++) {
TreeNode cur = queue.poll();
ans.add(cur.val);
if (cur.left != null) {
queue.offer(cur.left);
}
if (cur.right != null) {
queue.offer(cur.right);
}
}
arr.add(0, ans);
}
return arr;
}
}
//C++中可以直接用翻转函数解决reverse(ans.begin(), ans.end());