LDR二叉樹的中序遍歷

二叉樹的中序遍歷
1.遞歸的方法,這個比較簡單。
2.迭代的方法,迭代主體一定要構思好,不然就可能寫的非常複雜。首先迭代維護一個指針,指向當前節點,如果節點不爲空,則節點入棧,指針指向該節點的左子樹。如果節點爲空,則節點指向棧頂節點的右子樹,再將棧頂節點彈出………… 棧空則中序遍歷完成。

將二叉樹節點數值按中序遍歷存入向量中:

vector<int> inorderTraversal(TreeNode* root) {
        vector<int> res;  		//用於存放結果的向量
        stack<TreeNode*> s;		//存放節點的棧
        TreeNode *curr;			//指向當前樹節點的指針
        curr = root;			//指針指向根節點
        while (curr != NULL || !s.empty()) {
            if (curr != NULL) {
                s.push(curr);		
                curr = curr->left;
            } else {
                res.push_back(s.top()->val);
                curr = s.top()->right;
                s.pop();
            }
        }
        return res;
    }

以上兩種方法都屬於DFS,只是使用的棧不同。
1.遞歸使用的是隱式棧,因爲調用函數時函數會入棧(系統棧),等到返回時出棧。
2.迭代法使用的是顯式棧,程序中需要聲明一個棧用於存放節點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章