日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

【C++】二叉树的先序、中序、后序遍历序列

發布時間:2023/11/27 生活经验 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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++】二叉树的先序、中序、后序遍历序列的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。