二叉树三种遍历方式的非递归实现
生活随笔
收集整理的這篇文章主要介紹了
二叉树三种遍历方式的非递归实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
樹的遞歸實現方式很簡單,下面介紹三種遍歷的非遞歸實現。
樹的遍歷有個特點,那就是在處理具體問題時,絕大多數情況下是在當前循環、或函數(或是子樹)的根節點來處理的,能夠注意到當前根節點是如何從上個根節點得來是關鍵。
1.先序遍歷
注意棧先進后出,先壓右節點。
void preOrder(node *root) {stack<node*>sk;sk.push(root);while(!sk.empty()){node *cur = sk.top();//棧頂元素是當前的結點sk.pop();//彈出棧頂元素cout<<cur->v<<" ";//visitif(cur->rson!=NULL) sk.push(cur->rson);if(cur->lson!=NULL) sk.push(cur->lson);} }2.中序遍歷
//m1 void Inorder(node *root) {stack<node*>sk;while(!sk.empty() || root!=NULL){if(root == NULL){//左為空node *cur = sk.top();sk.pop();cout<<cur->v<<" ";//根遍歷完root = cur->rson;//遍歷右子樹}else{sk.push(root);root = root->lson;//先遍歷左子樹}} }//m2int kthSmallest(TreeNode* root, int k) {stack<TreeNode*> stack;while (root || stack.size() > 0) {while (root) {stack.push(root);root = root->left;}root = stack.top();stack.pop();k--;if (k == 0) {return root->val;}root = root->right;}return 0;}3. 后序遍歷:創建兩個空棧,一個棧保存結點元素,一個棧保存輸出的答案??根右左到左右根
void posOrder(node *root) {stack<node*>sk; //保存結點元素stack<node*>res; //保存輸出的元素sk.push(root);while(!sk.empty()){//根右左node *cur = sk.top();sk.pop();res.push(cur);if(cur->lson != NULL) sk.push(cur->lson);if(cur->rson != NULL) sk.push(cur->rson);}while(!res.empty()){//左右根cout<<res.top()->v<<" ";res.pop();} }總結
以上是生活随笔為你收集整理的二叉树三种遍历方式的非递归实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unity 中文不显示问题
- 下一篇: execCommand全集