/* 02.*Copyright (c) 2015,烟台大学计算机学院 03.*All rights reserved. 04.*文件名称:cengcibianli.cpp 05.*作者:朱希康 06.*完成日期:2015年11月20日 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; }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; }
#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; } }
运行结果:
知识点总结:
在线索二叉树中,节点的左指针为空(1)-----该指针指向该节点的前驱节点;节点右指针为空(1)-----该指针指向该节点的后继节点。