二叉樹的中序遍歷
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.迭代法使用的是顯式棧,程序中需要聲明一個棧用於存放節點。