先序,中序,后序线索二叉树
生活随笔
收集整理的這篇文章主要介紹了
先序,中序,后序线索二叉树
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
//后序線索,這種方法不容易想到 #include<iostream> #include<cstring> #include<cstdio> #include<algorithm>using namespace std;struct TREE{int val;TREE *ch[2];TREE *thread;//該節點的線索的下一個節點 TREE(){}TREE(int val){this->val = val;ch[0] = ch[1] = NULL;thread = NULL;} };void buildT(TREE * &T){int x;scanf("%d", &x);if(x == -1) return ;T = new TREE(x);buildT(T->ch[0]);buildT(T->ch[1]); }void postThread(TREE *T, TREE *pre){if(!T) return;postThread(T->ch[0], T);postThread(T->ch[1], T);if(pre){if(pre->ch[0] == T && pre->ch[1])//T是左子樹 T->thread = pre->ch[1]; //T的下一個節點就是它的兄弟節點 else //T是右子樹T->thread = pre;//T的下一個節點就是它 的父親節點 } }void printT_pre(TREE *T){//前序打印 if(!T) return ;printf("%d ", T->val);printT_pre(T->ch[0]);printT_pre(T->ch[1]); }void printT_Thread(TREE *T){//后序線索打印 TREE *root = T;bool flag = true;//表明T所在的字數沒有訪問過 while(1){while(flag && T->ch[0]) T = T->ch[0];printf("%d ", T->val);if(T->thread->ch[0] == T || T->thread->ch[1] == T)flag = false;//如果 T沒有兄弟節點了,就一直沿著它的父節點向上走 else flag = true;T = T->thread;if(T == root){//再次回到最頂端父節點時, 結束! printf("%d ", T->val); break;}} }int main(){TREE *T = NULL;buildT(T);printT_pre(T);printf("\n");postThread(T, NULL);printT_Thread(T);printf("\n");return 0; }
下面是基本按照同樣的套路實現二叉樹的先序,中序,后序的線索
//中序線索 #include<stdio.h> #include<stdlib.h> #define Thread 1 #define Tlink 0 typedef struct tree {int d;struct tree* lchild;struct tree* rchild;int Ltag, Rtag; }*TREE;void build_tree(TREE &T) {int d;scanf("%d", &d);if(d!=-1){T=(TREE)malloc(sizeof(tree));T->d=d;T->lchild=T->rchild=NULL;T->Ltag=T->Rtag=Tlink;build_tree(T->lchild);build_tree(T->rchild);} } TREE pre;void inorThread_tree(TREE p) {if(p){if(p->Ltag==Tlink)//當只有一個結點的時候,要加上這句話 inorThread_tree(p->lchild);if(!p->lchild){p->lchild=pre;p->Ltag=Thread;}if(!pre->rchild){pre->rchild=p;pre->Rtag=Thread;}pre=p;if(p->Rtag==Tlink)inorThread_tree(p->rchild);} }/* 上述代碼可以簡化如下,pre的初值為NULL就好 void inorThread_tree(TREE p) {if(p){ inorThread_tree(p->lchild);if(!p->lchild){p->lchild=pre;p->Ltag=Thread;}if(pre && !pre->rchild){pre->rchild=p;pre->Rtag=Thread;}pre=p; inorThread_tree(p->rchild);} } */void print_tree(TREE T){if(T){print_tree(T->lchild);printf("%d ", T->d);print_tree(T->rchild);} }void print_inorThr_tree(TREE T) {TREE p=T;while(1){while(p->Ltag==Tlink)p=p->lchild;printf("%d ", p->d);while(p->Rtag==Thread){p=p->rchild;printf("%d ", p->d);}p=p->rchild;if(p==T)break;} }int main() {TREE T=NULL;build_tree(T);print_tree(T);//遞歸中序遍歷 printf("\n"); pre=T;inorThread_tree(T);//非遞歸中序遍歷 pre->rchild=T;pre->Rtag=0;//保證只有一個結點的情況 print_inorThr_tree(T);return 0; }
總結
以上是生活随笔為你收集整理的先序,中序,后序线索二叉树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux_CentOS-服务器搭建 六
- 下一篇: public static float