leetcode原題:94. 二叉樹的中序遍歷
題目描述
給定一個二叉樹的根節點root,返回它的中序遍歷。
示例 1:
輸入:root = [1,null,2,3]
輸出:[1,3,2]
示例 2:
輸入:root = []
輸出:[]
示例 3:
輸入:root = [1]
輸出:[1]
示例 4:
輸入:root = [1,2]
輸出:[2,1]
示例 5:
輸入:root = [1,null,2]
輸出:[1,2]
提示:
- 樹中節點數目在范圍
[0, 100]內 - -100 <=
Node.val<= 100
進階: 遞歸算法很簡單,你可以通過迭代算法完成嗎?
分析
遞歸思路:
先遞歸訪問左孩子,然后記錄該節點的值,再遞歸訪問右孩子。
迭代思路:
中序遍列,始終牢記【左,根,右】的順序,優先左孩子,然后根節點,最后右孩子,遍歷左右孩子時同樣遵循【左,根,右】的順序。
- 只要有左孩子,就需要一直往左遍歷,所以需要用
棧來記錄遇到的節點,直到左孩子為空為止; - 彈出棧頂元素,並輸出該節點的值;
- 當第2步中的棧頂節點的右孩子為空,則重復步驟2和3,否則重復步驟1,2,3。
實現
Java
遞歸版本:
/**
* 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<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
visit(res, root);
return res;
}
public void visit(List<Integer> res, TreeNode root) {
if (root != null) {
visit(res, root.left);
res.add(root.val);
visit(res, root.right);
}
}
}
迭代版本:
/**
* 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<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
if (root == null) {
return res;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
LinkedList<TreeNode> stack = new LinkedList<>();
while (!queue.isEmpty() || !stack.isEmpty()) {
if (!queue.isEmpty()) {
TreeNode cur = queue.poll();
stack.push(cur);
while (cur.left != null) {
cur = cur.left;
stack.push(cur);
}
}
if (!stack.isEmpty()) {
TreeNode cur = stack.pop();
res.add(cur.val);
if (cur.right != null) {
queue.offer(cur.right);
}
}
}
return res;
}
}
迭代過程中,你可以發現上面代碼的那個queue中其實始終最多只會有一個元素,所以可以再簡單優化一下:
/**
* 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<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
if (root == null) {
return res;
}
LinkedList<TreeNode> stack = new LinkedList<>();
TreeNode cur = root;
while (cur != null || !stack.isEmpty()) {
if (cur != null) {
stack.push(cur);
cur = cur.left;
} else {
cur = stack.pop();
res.add(cur.val);
cur = cur.right;
}
}
return res;
}
}
Python3
遞歸版本:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
res = []
def visit(root: TreeNode):
if root:
visit(root.left)
res.append(root.val)
visit(root.right)
visit(root)
return res
迭代版本:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
res = []
cur = root
stack = []
while cur or stack:
if cur:
stack.append(cur)
cur = cur.left
else:
cur = stack.pop()
res.append(cur.val)
cur = cur.right
return res
