首页 > 代码库 > 后序线索二叉树
后序线索二叉树
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 6 using namespace std; 7 8 struct TREE{ 9 int val;10 TREE *ch[2];11 TREE *thread;//该节点的线索的下一个节点 12 TREE(){}13 TREE(int val){14 this->val = val;15 ch[0] = ch[1] = NULL;16 thread = NULL;17 }18 };19 20 void buildT(TREE * &T){21 int x;22 scanf("%d", &x);23 if(x == -1) return ;24 25 T = new TREE(x);26 buildT(T->ch[0]);27 buildT(T->ch[1]);28 }29 30 31 void postThread(TREE *T, TREE *pre){//感觉后序线索二叉树的思路和中序及前序的思路完全不一样啊 32 if(!T) return;33 postThread(T->ch[0], T);34 postThread(T->ch[1], T);35 if(pre){36 if(pre->ch[0] == T && pre->ch[1])//T是左子树 37 T->thread = pre->ch[1]; //T的下一个节点就是它的兄弟节点 38 else //T是右子树39 T->thread = pre;//T的下一个节点就是它 的父亲节点 40 }41 }42 43 void printT_pre(TREE *T){//前序打印 44 if(!T) return ;45 printf("%d ", T->val);46 printT_pre(T->ch[0]);47 printT_pre(T->ch[1]);48 }49 50 void printT_Thread(TREE *T){//后序线索打印 51 TREE *root = T;52 bool flag = true;//表明T所在的字数没有访问过 53 while(1){54 while(flag && T->ch[0]) T = T->ch[0];55 printf("%d ", T->val);56 if(T->thread->ch[0] == T || T->thread->ch[1] == T)57 flag = false;//如果 T没有兄弟节点了,就一直沿着它的父节点向上走 58 else flag = true;59 T = T->thread;60 if(T == root){//再次回到最顶端父节点时, 结束! 61 printf("%d ", T->val); 62 break;63 }64 }65 }66 67 int main(){68 TREE *T = NULL;69 buildT(T);70 printT_pre(T);71 printf("\n");72 postThread(T, NULL);73 printT_Thread(T);74 printf("\n");75 return 0;76 }
后序线索二叉树
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。