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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

6.3.2线索二叉树

發(fā)布時間:2025/3/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 6.3.2线索二叉树 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

我們知道,當(dāng)以二叉鏈表作為存儲結(jié)構(gòu)時,只能找到結(jié)點的左、右孩子信息,而不能直接得到結(jié)點在任一序列中的前驅(qū)和后繼信息。


做下面規(guī)定:若結(jié)點有左子樹,則其lchild指示其左孩子,否則令lchild域指示其前驅(qū);若結(jié)點有右子樹,則其rchild域指示其右孩子,否則rchild域指示其后繼。這樣我們增加兩個標(biāo)志域(如下圖所示)


這種結(jié)構(gòu)就是先是鏈表,對應(yīng)的樹就是線索二叉樹。


這個有什么用呢?

我們舉個例子。

比如,下面的這個樹:


這個圖里面:我們?nèi)绻孟刃虮闅v為:ABDHIECFG但是我們看到這個H,I,E,F,G他們的左右孩子都為空,

但我們把他中序遍歷后為HDIBEAFCG,我們可以看到他們剛剛好,H,I,E,F,G他們的左右孩子都為空。但他們恰好可以用這個放他們的前驅(qū)或后繼。

這就是線索二叉樹的好處。。


代碼如下:

#include <stdio.h> #include <stdlib.h> #include <Windows.h>typedef char ElemType;//線索存儲標(biāo)志位 //Link(0):表示指向左右孩子的指針 //Thread(1):表示指向前驅(qū)后繼的線索 typedef enum{Link,Thread} PointerTag;typedef struct BitThrNode {char data;struct BitThrNode *lchild, *rchild;PointerTag ltag; //標(biāo)志左孩子PointerTag rtag; //標(biāo)志右孩子 }BiThrNode,*BiThrTree;//全局變量始終指向剛剛訪問過的節(jié)點 BiThrTree pre;//創(chuàng)建一顆二叉樹,按照前序遍歷方式輸入 void CreateBiThrTree(BiThrTree *T) {char c;scanf_s("%c", &c);if ('$' == c){*T = NULL;}else{*T = (BiThrNode*)malloc(sizeof(BiThrNode));(*T)->data = c;(*T)->ltag = Link;(*T)->rtag = Link;CreateBiThrTree(&(*T)->lchild);CreateBiThrTree(&(*T)->rchild);}}//中序遍歷線索化 void InThreading(BiThrTree T) {if (T){InThreading(T->lchild); //遞歸左孩子線索化//結(jié)點處理if (!T->lchild) //如果該結(jié)點沒有左孩子,設(shè)置ltag為Thread,并把lchild指向剛剛訪問的結(jié)點。{T->ltag = Thread;T->lchild = pre;}if (!pre->rchild){pre->rtag = Thread;pre->rchild = T;}pre = T;InThreading(T->rchild); //遞歸右孩子線索化} }void InOrderThreading(BiThrTree *p,BiThrTree T) {*p = (BiThrTree)malloc(sizeof(BiThrNode));(*p)->ltag = Link;(*p)->rtag = Thread;(*p)->rchild = *p;if (!T){(*p)->lchild = *p;}else{(*p)->lchild = T;pre = *p;InThreading(T);pre->rchild = *p;pre->rtag = Thread;(*p)->rchild = pre;} }void visit(char c) {printf_s("%c", c); }//中序遍歷二叉樹,非遞歸 void InOrderTraverse(BiThrTree T) {BiThrTree p;p = T->lchild;while (p != T){while (p->ltag == Link){p = p->lchild;}visit(p->data);while (p->rtag == Thread && p->rchild != T){p = p->rchild;visit(p->data);}p = p->rchild;} }int main() {BiThrTree P, T = NULL;CreateBiThrTree(&T);InOrderThreading(&P, T);printf_s("中序遍歷輸出結(jié)果為:");InOrderTraverse(P);printf_s("\n");system("pause");return 0; } 下面是運行結(jié)果:



總結(jié)

以上是生活随笔為你收集整理的6.3.2线索二叉树的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。