【C++】二叉树的先序、中序、后序遍历序列
生活随笔
收集整理的這篇文章主要介紹了
【C++】二叉树的先序、中序、后序遍历序列
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
二叉樹常用到的遍歷有這三種
先序遍歷:先遍歷根節點,然后再分別遍歷左節點和右節點。(根左右)
中序遍歷:先遍歷左節點,然后再遍歷根節點,最后遍歷右節點。(左根右)
后序遍歷:先遍歷左節點,然后再遍歷右節點,最后遍歷根節點。(左右根)
如下圖所示:
按照中序遍歷的打印順序為:D B E A F C G
按照先序遍歷的打印順序為:A B D E C F G
按照后序遍歷的打印順序為:D E B F G C A
我們先來看一下關于二叉樹的創建:
先來看關于二叉樹中指針的指向的創建:
typedef class BtNode
{
public:char data; //數據struct BtNode* leftchild; //左孩子struct BtNode* rightchild;//右孩子
}BtNode, * BiaryTree;
二叉樹的構建:
BtNode* CreatTree()
{BtNode* s = NULL;char elem; //輸入想進行中序,前序或后序遍歷的二叉樹節點cin >> elem;if (elem != '#') //此處#代表孩子節點為NULL{s = BuyNode();s->data = elem;s->leftchild = CreatTree();s->rightchild = CreatTree();}return s;
}
二叉樹創建中使用到的BuyNode()函數
BtNode* BuyNode()
{BtNode* s = (BtNode*)malloc(sizeof(BtNode));if (NULL == s) exit(1);memset(s, 0, sizeof(BtNode));return s;
}
實現上述三種遍歷的代碼:
遞歸版本的三種遍歷方法
? ? ? ? 遞歸實現中序遍歷:
void InOrder(BtNode* ptr)
{if (ptr != nullptr){InOrder(ptr->leftchild);cout << ptr->data << " ";InOrder(ptr->rightchild);}
}
? ? ? ? 遞歸實現前序遍歷:
void PreOrder(BtNode* ptr)
{if (ptr != nullptr){cout << ptr->data << " ";PreOrder(ptr->leftchild);PreOrder(ptr->rightchild);}
}
????????遞歸實現后續遍歷:
void PassOrder(BtNode* ptr) //
{if (ptr != nullptr){PassOrder(ptr->leftchild);PassOrder(ptr->rightchild);cout << ptr->data << " ";}
}
上述代碼詳解:(下圖以中序遍歷來舉例,前序和后續類似)
?非遞歸版本的三種遍歷:
中序遍歷:
void NiceInorder(BtNode* ptr)
{if (ptr == NULL) return;std::stack<BtNode*> st;while (ptr != NULL || !st.empty()){while (ptr != NULL){st.push(ptr);ptr = ptr->leftchild;}ptr = st.top(); st.pop();cout << ptr->data;ptr = ptr->rightchild;}cout << endl;
}
后序遍歷:
void NicepastOrder(BtNode* ptr)
{if (ptr == NULL) return;std::stack<BtNode*> st;BtNode* tag = NULL; //tag指針相當于一個跟屁蟲 你訪問過那個指針 我就指向哪個指針while (ptr != NULL || !st.empty()) //剩下的思路和中序遍歷幾乎一毛一樣{while (ptr != NULL){st.push(ptr);ptr = ptr->leftchild;}ptr = st.top();st.pop();if (ptr->rightchild == NULL || ptr->rightchild == tag){cout << ptr->data;tag = ptr;ptr = NULL;}else{st.push(ptr);ptr = ptr->rightchild;}}cout << endl;
}
非遞歸中序遍歷的代碼詳解 (思路類似,對照著看,可以看明白的):
?
"多看多敲就可以變強(當然也可以變禿)"
?
總結
以上是生活随笔為你收集整理的【C++】二叉树的先序、中序、后序遍历序列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用啥宠物打兽王容易掉碎片
- 下一篇: 【C++】多线程(链式、循环队列)实现生