第十一周项目3 中序线索化二叉树算法
2015-12-04 08:17
316 查看
/* 02.*Copyright (c) 2015,烟台大学计算机学院 03.*All rights reserved. 04.*文件名称:cengcibianli.cpp 05.*作者:孙钦达 06.*完成日期:2015年11月27日 07.*版本号:vc++6.0 08.* 09.*问题描述:线索二叉树 10.*输入描述:无 11.*程序输出:二叉树 12.*/
#ifndef HEAD_H_INCLUDED #define HEAD_H_INCLUDED #define MaxSize 100 #include<stdio.h> #include<malloc.h> typedef char ElemType; typedef struct node { ElemType data; int ltag,rtag; struct node *lchild; struct node *rchild; <pre class="cpp" name="code">#include "head.h" TBTNode *pre; void CreateTBTNode(TBTNode * &b,char *str) { TBTNode *St[MaxSize],*p; int top=-1,k,j=0; char ch; b=NULL; ch=str[j]; while(ch!='\0') { switch(ch) { case '(': top++; St[top]=p; k=1; break; case ')': top--; break; case ',': k=2; break; default: p=(TBTNode *)malloc(sizeof(TBTNode)); p->data=ch; p->lchild=p->rchild=NULL; if(b==NULL) b=p; else { switch(k) { case 1: St[top]->lchild=p; break; case 2: St[top]->rchild=p; break; } } } j++; ch=str[j]; } } void DispTBTNode(TBTNode *b) { if(b!=NULL) { printf("%c",b->data); if(b->lchild!=NULL||b->rchild!=NULL) { printf("("); DispTBTNode(b->lchild); if(b->rchild!=NULL) printf(","); DispTBTNode(b->rchild); printf(")"); } } }void Thread(TBTNode *&p) { if (p!=NULL) { Thread(p->lchild); //左子树线索化 if (p->lchild==NULL) //前驱线索 { p->lchild=pre; //建立当前结点的前驱线索 p->ltag=1; } else p->ltag=0; if (pre->rchild==NULL) //后继线索 { pre->rchild=p; //建立前驱结点的后继线索 pre->rtag=1; } else pre->rtag=0; pre=p; Thread(p->rchild); //右子树线索化 } } TBTNode *CreaThread(TBTNode *b) { TBTNode *root; root=(TBTNode *)malloc(sizeof(TBTNode)); root->ltag=0; root->rtag=1; root->rchild=b; if(b==NULL) root->lchild=root; else { root->lchild=b; pre=root; Thread(b); pre->rchild=root; pre->rtag=1; root->rchild=pre; } return root; } void ThInOrder(TBTNode *tb) { TBTNode *p=tb->lchild; while (p!=tb) { while (p->ltag==0) p=p->lchild; printf("%c ",p->data); while (p->rtag==1 && p->rchild!=tb) { p=p->rchild; printf("%c ",p->data); } p=p->rchild; } }
}TBTNode;void CreateTBTNode(TBTNode * &b,char *str);//建立二叉树void DispTBTNode(TBTNode *b);//输出二叉树void Thread(TBTNode *&p);//线索化TBTNode *CreaThread(TBTNode *b);//线索化二叉树void ThInOrder(TBTNode *tb);//中序遍历#endif // HEAD_H_INCLUDED
#include "head.h" int main() { TBTNode *b,*tb; CreateTBTNode(b,"A(B(D(,G)),C(E,F))"); printf(" 二叉树:"); DispTBTNode(b); printf("\n"); tb=CreaThread(b); printf(" 线索中序序列:"); ThInOrder(tb); printf("\n"); return 0; }
运行结果:
知识点总结:
在线索二叉树中,节点的左指针为空(1)-----该指针指向该节点的前驱节点;节点右指针为空(1)-----该指针指向该节点的后继节点。
相关文章推荐
- (第十二周项目2)操作用邻接表存储的图
- 第十四周项目1-(1)验证折半查找算法
- 十四周 项目三-是否二叉排序树
- 【模板】字符串算法-字符串最小表示法
- python --for循环
- (第十二周项目1)图基本算法库
- DVWA系列之4 利用SQLMap进行medium级别注入
- DVWA系列之4 利用SQLMap进行medium级别注入
- test
- python --if语句
- Linux下vsftpd的简单应用(一)
- cocos2d-js开发总结
- 验证分块查找算法
- 博客开张 自嗨自勉
- nagios 自定义插件demo
- [LeetCode]Two Sum II - Input array is sorted
- An universal algorithm design of fixed length substring locating
- An universal algorithm design of fixed length substring locating
- 第14周 项目2 - 二叉树排序树中查找的路径
- 堆和栈的区别