173. Binary Search Tree Iterator(二叉查詢樹迭代器)的C++解法
阿新 • • 發佈:2018-12-25
注意是二叉查詢樹,意味著左子樹<根<右子樹,因此,如果沒有特殊要求,只需要中序遍歷樹,將每個結點儲存即可。
但是題目要求空間複雜度為O(h),h是二叉查詢樹的深度,因此考慮每次只放一部分樹的結點入棧。首先我們知道根的左子樹的左子樹的左子樹...一直到最左的左子樹L一定是最小值,那麼先把這部分壓入棧,棧頂元素L就是最小值。而下一個最小值,有可能是這個結點的右子樹(根L->right,或者根的左子樹L->right->.....left),那麼把這部分壓入棧中;如果沒有的話就向上找L->father(樹的結構裡沒有這個值但是棧中已經儲存了)。
圖形解釋可以看這篇部落格。
class BSTIterator { public: stack<TreeNode *> s; BSTIterator(TreeNode *root) { while(root!=NULL) { s.push(root); root=root->left; } } bool hasNext() { if (s.empty()) return false; else return true; } int next() { TreeNode * res=s.top(); s.pop(); TreeNode * tmp=res->right; while (tmp!=NULL) { s.push(tmp); tmp=tmp->left; } return res->val; } };
- 還有要求空間複雜度為O(1)的,我想可以參考Morris演算法。Morris演算法主要利用了葉子節點的左右子樹均為空的特性,構建一個從葉子到根的迴路來代替棧。