日韩性视频-久久久蜜桃-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++实现链式存储线索二叉树的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 污污视频网站在线免费观看 | 9人人澡人人爽人人精品 | 日本高清视频一区二区三区 | 黄色一级国产 | 91黄色短视频 | 狠狠躁18三区二区一区 | 亚洲毛片在线免费观看 | 国产女主播一区二区 | 国产精久久一区二区三区 | 超碰成人网| 东北女人av | 亚洲自拍偷拍网 | 日韩三级免费观看 | 精品无码久久久久国产 | 国产青青草视频 | 欧美在线视频第一页 | 黄久久久 | 夜夜嗨老熟女av一区二区三区 | 中文字幕自拍偷拍 | 日韩欧美手机在线 | 91亚洲国产成人精品一区二三 | 国产偷拍一区二区三区 | 国产精彩视频一区二区 | 国产香蕉在线视频 | 蜜桃视频一区二区 | 天天操免费视频 | 精品国产综合 | 日韩中文字幕网址 | 青青操久久 | 韩国伦理大全 | 琪琪射| 超碰超碰 | 亚洲永久在线 | 视频一区二区免费 | 蜜臂av | 国产免费一区二区 | julia一区二区三区在线观看 | www在线观看国产 | 99久久精品一区二区成人 | 国模人体私拍xvideos | 美女搞黄在线观看 | 国产+日韩+欧美 | 日本吃奶摸下激烈网站动漫 | 久久久久人妻一区 | 亚洲黄色在线观看视频 | 午夜亚洲天堂 | 风间由美在线观看 | 久久性色 | www.在线国产 | 国产又粗又黄视频 | 四虎国产精品永久在线国在线 | 91精品91久久久中77777 | 野外吮她的花蒂高h在线观看 | 黄色av网站免费观看 | 神马午夜伦 | 亚洲一区二区小说 | 欧美日韩免费一区 | 亚洲日批 | 麻豆激情网 | 成人动漫免费观看 | h小视频在线观看 | 中文字幕天堂在线 | 国产免费内射又粗又爽密桃视频 | 久久亚洲高清 | 久草精品在线 | 国产精品久久久久久久久久久久久久久久久 | 色吊丝中文字幕 | 91精品久久久久久综合五月天 | 国产精自产拍久久久久久蜜 | 久久久天天 | 香蕉在线观看视频 | 日日夜夜中文字幕 | 免费淫片 | 中文字幕精 | 秋霞三区| 国产一区二区三区精品在线观看 | 9色在线视频 | 精久久| 日韩精彩视频在线观看 | 久久久久久国产精品免费免费 | 国产免费看 | 日本精品在线 | 欧洲国产视频 | av在线资源网站 | 无码专区久久综合久中文字幕 | 中国免费看的片 | 亚洲精品黄色 | 夜夜爽av福利精品导航 | 欧美大片www| 黄色性大片 | 国产一级视频在线观看 | 91成人午夜 | 91香蕉视频黄色 | 国产成人无码aa精品一区 | 久操视频在线观看免费 | 亚欧洲精品在线视频 | 99r精品视频 | 国产精品国产三级国产aⅴ无密码 | 囯产精品一品二区三区 |