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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++实现链式存储线索二叉树

發布時間:2023/12/4 c/c++ 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++实现链式存储线索二叉树 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一顆線索二叉樹:

根據下圖進行節點的創建:

代碼如下:

#include <iostream> using namespace std; typedef char ElemType;typedef struct BiThrNode {ElemType data;int ltag,rtag;struct BiThrNode *lchild,*rchild; }BiThrNode,*BiThrTree;


因為普通二叉樹有空指針域,所以我們可以利用這些空指針來線索化

1、二叉樹的線索化,實質上就是遍歷一棵二叉樹,在遍歷過程中,訪問節點的操作是檢查當前結點的左右指針域是否為空,如果為空,即將他們改為前驅節點或后繼節點的線索。為記錄前驅節點,定義pre為全局變量,始終指向當前結點的前驅節點。

定義一個全局變量指向線索二叉樹的前驅節點:

BiThrNode *pre;

中序遍歷進行線索化:

void InThreading(BiThrTree p) {if (p){InThreading(p->lchild);if (!p->lchild){p->ltag = 1;p->lchild = pre;}if (!pre->rchild){pre->rtag = 1;pre->rchild = p;}pre = p;InThreading(p->rchild);} }

根據下圖建立頭結點,線索化:


代碼如下:

bool InOrderThr(BiThrNode *head,BiThrTree T) {head = new BiThrNode;if (head==NULL)return false;head->ltag = 0;head->rtag = 1;head->rchild = head;if (!T){head->lchild = head;}else{head->lchild = T;pre = head;InThreading(T);pre->rchild = head;pre->rtag = 1;head->rchild = pre;}return true; }

對于中序線索二叉樹上的任意節點,尋找其中序的前驅節點,有以下兩種情況:
1、如果該節點的左標志域為1,那么其左指針所指向的節點便是它的前驅節點。
2、如果該節點的左標志為0,表明該節點有左孩子,根據中序遍歷的定義,它的前驅節點是以該節點的左孩子為根節點的子樹的最右節點,即沿著其左子樹的右指針鏈向下查找,當某節點的右標志域為1時,它就是所要找的前驅節點。

在中序線索二叉樹上查找任意節點的中序前驅節點:

BiThrNode *InPreNode(BiThrNode *p) {BiThrNode *pre;pre = p->lchild;if (p->ltag!=1){while(pre->rtag == 0){pre = pre->rchild;}}return pre; }

對于中序線索二叉樹上的任意節點,尋找其中序的后繼節點,有以下兩種情況:
1、如果該節點的右標志域為1,那么其右指針所指向的節點便是它的后繼節點。
2、如果該節點的右標志為0,表明該節點有右孩子,根據中序遍歷的定義,它的后繼節點是以該節點的右孩子為根節點的子樹的最左節點,即沿著其右子樹的左指針鏈向下查找,當某節點的左標志域為1時,它就是所要找的后繼節點。

在中序線索二叉樹上查找任意節點的中序后繼節點:

BiThrNode *InpostNode(BiThrNode *p) {BiThrNode *post;post = p->rchild;if (p->rtag!=1){while(post->ltag==0){post = post->lchild;}}return post; }

從最后一個節點根據前驅節點進行線索二叉樹的遍歷:

void InOrderPre(BiThrNode *head) {BiThrNode *p;p = head->rchild;//指向最后一個節點while(p != NULL && p!=head){cout<<p->data;p = InPreNode(p);} }

從第一個節點根據后繼節點進行線索二叉樹的遍歷:

void InOrderPost(BiThrNode *head) {BiThrNode *p;p = head->lchild;while (p->ltag != 1) {p = p->lchild;}while (p != NULL && p != head) {cout << p->data;p = InPostNode(p);} }

完整代碼如下:

#include <iostream> using namespace std; typedef char ElemType;typedef struct BiThrNode {//節點的創建ElemType data;int ltag, rtag;struct BiThrNode *lchild, *rchild; } BiThrNode, *BiThrTree;BiThrNode *pre;//定義一個全局變量指向線索二叉樹的前驅節點void InThreading(BiThrTree &p) {if (p) {InThreading(p->lchild);if (!p->lchild) {p->ltag = 1;p->lchild = pre;}if (!pre->rchild) {pre->rtag = 1;pre->rchild = p;}pre = p;InThreading(p->rchild);} }bool InOrderThr(BiThrTree &head, BiThrTree T) {head = new BiThrNode;if (head == NULL)return false;head->ltag = 0;head->rtag = 1;head->rchild = head;if (!T) {head->lchild = head;} else {head->lchild = T;pre = head;InThreading(T);pre->rchild = head;pre->rtag = 1;head->rchild = pre;}return true; }BiThrNode *InPreNode(BiThrNode *p) {BiThrNode *pre;pre = p->lchild;if (p->ltag != 1) {while (pre->rtag == 0) {pre = pre->rchild;}}return pre; }BiThrNode *InPostNode(BiThrNode *p) {BiThrNode *post;post = p->rchild;if (p->rtag != 1) {while (post->ltag == 0) {post = post->lchild;}}return post; }void InOrderPre(BiThrNode *head) {BiThrNode *p;p = head->rchild;//指向最后一個節點while (p != NULL && p != head) {cout << p->data;p = InPreNode(p);} }void InOrderPost(BiThrNode *head) {BiThrNode *p;p = head->lchild;while (p->ltag != 1) {p = p->lchild;}while (p != NULL && p != head) {cout << p->data;p = InPostNode(p);} }void CreateBiTree(BiThrTree &T) {//以先序遍歷的方式創建二叉樹char ch;cin >> ch;if (ch == '#')T = NULL;else {T = new BiThrNode;T->data = ch;T->ltag = 0;T->rtag = 0;CreateBiTree(T->lchild);CreateBiTree(T->rchild);} }int main() {BiThrTree T;BiThrNode *head;CreateBiTree(T);//以先序遍歷輸入if (InOrderThr(head, T))cout << "線索化完成" << endl;elsecout << "線索化失敗" << endl;cout<<"逆序輸出中序遍歷: ";InOrderPre(head);//逆序輸出中序遍歷cout << endl;cout<<"正序輸出中序遍歷: ";InOrderPost(head);//正序輸出中序遍歷return 0; }

測試效果圖:

測試結果:

本文參考文章地址:
https://blog.csdn.net/g15827636417/article/details/52967949

總結

以上是生活随笔為你收集整理的C++实现链式存储线索二叉树的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: caoprom在线 | 日韩精品在线观看AV | 成人在线观看黄色 | 国产日日夜夜 | xxx麻豆| 亚洲一区二区三区四区视频 | 本站只有精品 | 最近更新中文字幕 | 欧美日韩亚洲二区 | 免费三片在线播放 | 精品无码人妻一区二区三区品 | 中文在线а√天堂 | 国产精品丝袜视频 | 九热在线 | 国产做爰免费观看 | 大奶子网站 | 日本成人社区 | 19韩国主播青草vip | 狠狠干狠狠操视频 | 97超碰精品| 国产黄页 | xxxxwww一片| 日韩欧美成人一区二区三区 | 一区二区三区视频在线观看 | 精品丰满人妻无套内射 | 国产性―交一乱―色―情人 | 天天射日 | 黄色wwwww | 亚洲国产精品午夜久久久 | 一卡二卡三卡四卡在线 | 国产一区二区不卡在线 | 午夜综合网 | 亚洲人女屁股眼交6 | 亚洲天堂男人 | 欧美日韩一区二区三区69堂 | 精品视频久久 | 日韩18p| 国产精品剧情 | 日本偷拍一区 | 亚洲ⅴ国产v天堂a无码二区 | jzzjzz日本丰满成熟少妇 | 爱情岛论坛成人 | 欧美午夜久久 | 色呦| 国产第一区第二区 | 国产伦精品一区二区三区四区 | 国产精品不卡一区 | 午夜精品网站 | 国产精品久久久久久久久久直播 | 国产一区二区三区中文字幕 | 少妇无内裤下蹲露大唇视频 | 一级特黄免费视频 | av中文字幕网址 | 朝桐光av在线 | 日本japanese极品少妇 | 伊人成人久久 | 女女h百合无遮涩涩漫画软件 | 日韩欧美一区二区三区 | 蜜臀av性久久久久蜜臀aⅴ | 懂色av蜜臀av粉嫩av分享吧最新章节 | 久久久久久无码精品人妻一区二区 | 女人张开双腿让男人捅 | 三级成人在线 | 日韩aⅴ视频 | 久久精品久久久久久久 | 久久亚洲精 | 糖心vlog精品一区二区 | 免看一级a毛片一片成人不卡 | 亚洲欧美精品在线观看 | 日韩精品免费电影 | 国产艳妇疯狂做爰视频 | av老司机在线播放 | 五月天视频网 | 91网址在线播放 | 午夜视频在线观看视频 | 五月激情片 | 中文免费av | 国产一区av在线 | 日韩 国产 在线 | 91激情影院| 韩国女同性做爰三级 | 天天干天天搞天天射 | 黄色a∨ | 国产精品一区一区三区 | 精品久久久免费 | 日日爱夜夜爱 | 最近中文字幕免费视频 | 蜜桃臀aⅴ精品一区二区三区 | 青青草精品 | 亚洲乱码日产精品bd在线观看 | 免费欧美日韩 | 亚欧洲精品视频 | 一级精品毛片 | 欧美成网| 操你啦影院| 亚洲一区国产精品 | 国产日韩在线看 | 天天爱天天干天天操 | www.97视频|