文章目錄
- 二叉樹的周遊總結
-
- 1、前序周遊
-
- (一)遞歸法
- (二)疊代法
- 2、中序周遊
-
- (一)遞歸法
- (二)疊代法
- 3、後序周遊
-
- (一)遞歸法
- (二)疊代法
- 4、層次周遊
-
- (一)遞歸法
- (二)疊代法
二叉樹的周遊總結
- 前序周遊:根→左→右
- 中序周遊:左→根→右
- 後序周遊:左→右→根
- 層次周遊:逐層周遊
1、前序周遊
給定一個二叉樹,傳回它的前序 周遊。
示例:
輸入: [1,null,2,3]

輸出: [1,2,3]
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/binary-tree-preorder-traversal
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
(一)遞歸法
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
helper(root, res);
return res;
}
private void helper(TreeNode root, List<Integer> res) {
if (root == null) return;
res.add(root.val);
helper(root.left, res);
helper(root.right, res);
}
}
(二)疊代法
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
if(root == null) return list;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while(!stack.isEmpty()){
TreeNode node = stack.pop();
list.add(node.val);
if(node.right != null)
stack.push(node.right);
if(node.left != null)
stack.push(node.left);
}
return list;
}
}
2、中序周遊
給定一個二叉樹,傳回它的中序 周遊。
示例:
輸入: [1,null,2,3]
輸出: [1,3,2]
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/binary-tree-inorder-traversal
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
(一)遞歸法
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
helper(root, res);
return res;
}
private void helper(TreeNode root, List<Integer> res) {
if (root == null) return;
helper(root.left, res);
res.add(root.val);
helper(root.right, res);
}
}
(二)疊代法
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
if (root == null) return list;
Stack<TreeNode> stack = new Stack<>();
TreeNode p = root;
while (!stack.isEmpty() || p != null) {
while (p != null) {
stack.push(p);
p = p.left;
}
TreeNode pop = stack.pop();
list.add(pop.val);
p = pop.right;
}
return list;
}
}
3、後序周遊
給定一個二叉樹,傳回它的 後序 周遊。
示例:
輸入: [1,null,2,3]
輸出: [3,2,1]
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/binary-tree-postorder-traversal
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
(一)遞歸法
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
helper(root, res);
return res;
}
private void helper(TreeNode root, List<Integer> res) {
if (root == null) return;
helper(root.left, res);
helper(root.right, res);
res.add(root.val);
}
}
(二)疊代法
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
LinkedList<Integer> list = new LinkedList<>();//需要addFirst方法
if (root == null) return list;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
list.addFirst(node.val);//先加根節點的數值,在最終結果裡排在最後
if (node.left != null) {
stack.push(node.left);
}
if (node.right != null) {
stack.push(node.right);
}
}
return list;
}
}
4、層次周遊
給定一個二叉樹,傳回其按層次周遊的節點值。 (即逐層地,從左到右通路所有節點)。
例如:
給定二叉樹: [3,9,20,null,null,15,7],
傳回其層次周遊結果:
[
[3],
[9,20],
[15,7]
]
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/binary-tree-level-order-traversal
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
(一)遞歸法
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> list = new ArrayList<List<Integer>>();
if (root == null) return list;
helper(root, list, 0);
return list;
}
private static void helper(TreeNode node, List<List<Integer>> list, int level) {
if (list.size() == level)
list.add(new ArrayList<Integer>());
list.get(level).add(node.val);
if (node.left != null)
helper(node.left, list, level + 1);
if (node.right != null)
helper(node.right, list, level + 1);
}
}
(二)疊代法
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> list = new ArrayList<>();
if (root == null) return list;
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
int level = 0;
while (!queue.isEmpty()) {
list.add(new ArrayList<>());
int levelWidth = queue.size();
for (int i = 0; i < levelWidth; i++) {
TreeNode node = queue.remove();
list.get(level).add(node.val);
if (node.left != null) queue.add(node.left);
if (node.right != null) queue.add(node.right);
}
level++;
}
return list;
}
}