給定二叉樹根節點,返回其中序遍歷序列。**不使用遞歸**。
Input: [1,null,2,3] (1 右子 2,2 左子 3)
1
\
2
/
3
Output: [1,3,2]
中序:左 → 根 → 右。用棧保存「待處理的左鏈」。
p = root。p == nullptr。p,訪問其值(中序位置)。p->right,重複步驟 2。p == nullptr。class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def inorderTraversal(self, root):
result, stack = [], []
p = root
while p or stack:
while p:
stack.append(p)
p = p.left
p = stack.pop()
result.append(p.val)
p = p.right
return result
class Solution {
public:
vector inorderTraversal(TreeNode* root) {
vector res;
stack st;
TreeNode* p = root;
while (p || !st.empty()) {
while (p) {
st.push(p);
p = p->left;
}
p = st.top(); st.pop();
res.push_back(p->val);
p = p->right;
}
return res;
}
};
O(n),每節點進出棧各一次。O(h),h 為樹高(最壞 O(n))。利用葉節點右指標為空建立執緒,遍歷後恢復。代碼較複雜,面試常考。