【LeetCode題解】94_二叉樹的中序遍歷
阿新 • • 發佈:2018-11-23
【LeetCode題解】94_二叉樹的中序遍歷
文章目錄
描述
給定一個二叉樹,返回它的中序遍歷。
示例:
輸入: [1,null,2,3]
1
\
2
/
3
輸出: [1,3,2]
進階: 遞迴演算法很簡單,你可以通過迭代演算法完成嗎?
方法一:遞迴
Java 程式碼
/**
* 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> ret = new ArrayList<>();
inorderTraversal(root, ret);
return ret;
}
private void inorderTraversal(TreeNode root, List<Integer> ret) {
if (root == null) {
return;
}
inorderTraversal(root.left, ret);
ret.add (root.val);
inorderTraversal(root.right, ret);
}
}
複雜度分析:
- 時間複雜度: ,其中, 為二叉樹節點的數目
- 空間複雜度:平均為 ,最壞的情況為
Python程式碼
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def inorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
def dfs(root, ret):
if root is None:
return
dfs(root.left, ret)
ret.append(root.val)
dfs(root.right, ret)
ret = list()
dfs(root, ret)
return ret
複雜度分析同上。
方法二:非遞迴
Java 程式碼
/**
* 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> ret = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
while (cur != null || !stack.isEmpty()) {
while (cur != null) {
stack.push(cur);
cur = cur.left;
}
cur = stack.pop();
ret.add(cur.val);
cur = cur.right;
}
return ret;
}
}
複雜度分析:
- 時間複雜度: ,其中, 為二叉樹節點的數目
- 空間複雜度: ,其中, 為二叉樹的高度
Python 程式碼
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def inorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
ret, stack = [], []
cur = root
while cur is not None or len(stack) > 0:
while cur is not None:
stack.append(cur)
cur = cur.left
cur = stack.pop()
ret.append(cur.val)
cur = cur.right
return ret
複雜度分析同上。