1. 程式人生 > >非遞歸的中序遍歷(inorder)樹 leetcode 94

非遞歸的中序遍歷(inorder)樹 leetcode 94

ont treenode inorder urn 左右子樹 rsa clas 遞歸 stack

 1 class Solution {
 2 public:
 3     vector<int> inorderTraversal(TreeNode* root) {
 4         stack<TreeNode*> s;
 5         vector<int> val;
 6         TreeNode* curr = root;
 7         s.push(curr);
 8         while(!s.empty()) {
 9             while(curr) {
10                 s.push(curr->left);
11 curr = curr->left; 12 } 13 curr = s.top(); 14 s.pop(); 15 if (curr) { 16 val.push_back(curr->val); 17 curr = curr->right; 18 if (curr) s.push(curr); 19 } 20
} 21 return val; 22 } 23 };

非遞歸時需要保留結點的父結點,這裏使用棧

首先把該結點的所有左節點都放在棧裏(8-12)

然後拿出一個結點,判斷是不是空結點

不是空結點就輸出,並將其右結點加入棧內

這樣就保證先輸出左子樹,然後輸出左子樹的右子樹,若左子樹是葉子結點則為空,輸出自己

然後將右結點加入棧中,重復以上過程

左右子樹輸出完畢時,curr總是指向空的右節點,不執行內層while

按入棧順序對父結點操作

非遞歸的中序遍歷(inorder)樹 leetcode 94