线索二叉树
来源:互联网 发布:智能电视视频点播软件 编辑:程序博客网 时间:2024/06/05 23:57
#include "common.h"#include <process.h>#include "Stack.h"#include "Queue.h"extern void DataStructure();static BOOL BinTreeLookUp(Node* node, int target);static Node* BinTreeInsert(Node* node, int data);static Node* NewNode(int data);static void BinTreePrint(Node* node);static void CreatBiTree(Tree* T);void PrintTree(Tree T);void InThreading(Node* node);void InOrderThreadHead(Tree* H,Tree P);void InOrderTraverseThr(Tree T);void DataStructure(){Tree T=NULL;Tree header=NULL;CreatBiTree(&T);BinTreePrint(T);printf("\n");//InOrderTraverse(T);//PreOrderTraverse(T);//PostOrderTraverse(T);//LevelOrderTraverse(T);InOrderThreadHead(&header,T);InOrderTraverseThr(header);}static void CreatBiTree(Tree* T){ElemType ch[100] = "";int len;int i;fgets(ch,100,stdin);len = strlen(ch);for(i=0; i<len-1; i++){//printf("%c ",ch[i]); *T = BinTreeInsert(*T, ch[i]);}printf("\n");}//http://zh.wikipedia.org/wiki/二叉树static BOOL BinTreeLookUp(Node* node, int target){if(node == NULL){return FALSE;}else{if(node->data == target){return TRUE;}else if (node->data < target){return BinTreeLookUp(node->rChild,target);}else if(node->data > target){return BinTreeLookUp(node->lChild,target);}}return FALSE;}static Node* BinTreeInsert(Node* node, int data){if(node == NULL){return NewNode(data);}else{if(node->data >= data){node->lChild = BinTreeInsert(node->lChild,data);}else{node->rChild = BinTreeInsert(node->rChild,data);}return node;}}static Node* NewNode(int data){Node* newNode = (Node*)malloc(sizeof(Node));memset(newNode,0,sizeof(newNode));newNode->data = data;newNode->lChild = NULL;newNode->rChild = NULL;#ifdef ThreadTreenewNode->LTag = Link;newNode->RTag = Link;#endif//newNode->parent = NULL;return newNode;}static void BinTreePrint(Node* node){if(node == NULL){return ;}//printf("<%c>",node->data);//先序遍历p,l,rBinTreePrint(node->lChild);printf("<%c>",node->data);//中序遍历l,p,rBinTreePrint(node->rChild);//printf("<%c>",node->data);//后序遍历}//建立线索二叉树//Node* preNode = NULL;//全局变量,指向访问过的上一个结点。void InThreading(Node* node){if(node == NULL){return ;}InThreading(node->lChild);if(!node->lChild)//如果没有左孩子设置成线索,{node->LTag = Thread;//左孩子设置成线索node->lChild = preNode;//前驱是上一个结点}if(!preNode->rChild)//如果没有右孩子{preNode->RTag = Thread;//右孩子设置成线索preNode->rChild = node;}preNode = node;InThreading(node->rChild);}/*LTag == 0 lChild 域指示节点的左孩子LTag == 1 lChild 域指示结点的前驱RTag == 0 rChild 域指示结点的右孩子RTag == 1 rChild 域指示结点的后继*///头结点void InOrderTraverseThr(Tree T){Tree P = T->lChild;while(P != T){//寻访第一个结点while(P->LTag == Link){P=P->lChild;}printf("%c ",P->data);//如同链表一样挨个寻访while(P->RTag == Thread && P->rChild != T){P = P->rChild;printf("%c ",P->data);}P = P->rChild;}}void InOrderThreadHead(Tree* H,Tree P){*H = (Tree)malloc(sizeof(Node));if(!(*H)){exit(-1);}(*H)->rChild = *H;(*H)->RTag = Thread;(*H)->LTag = Link;if(!P){(*H)->lChild = (*H);}else{preNode = (*H);(*H)->lChild = P;InThreading(P);//preNode保存了最后一个结点的地址preNode->rChild = (*H);preNode->RTag = Thread;(*H)->rChild = preNode;}}
#ifndef COMMON_H#define COMMON_H#include <stdio.h>#include <string.h>#include <stdlib.h>#include <windows.h>#include <malloc.h>#include <assert.h>//typedef int ElemType;/*#define Sthing a NewName( of Something)//not a operate sentence ,desposed before compilingtypedef a defined Type a New TypeName;//a sentence must ended by ";"*/void Debug(int* a,int n,int k);void Swap(int*a,int* b);#ifndef BOOLtypedef enum {false,true} BOOL;#endif#define TRUE 1#define FALSE 0#define OK 1#ifndef ERROR#define ERROR -1#endif#define OVERFLOW -2#define ESC 10#define CHAR 1#ifdef CHARtypedef char ElemType;typedef char TElemType;#elsetypedef int ElemType;typedef int TElemType;#endiftypedef int status;#define STACK_INIT_SIZE 100#defineSTACK_INCREMENT 100#define MAX_INIT_SIZE100typedef struct _SNode{struct _SNode *pre;struct _SNode *next;ElemType element;}SNode;#define TREE 1#define ThreadTree 1typedef struct _Node{//struct _Node *parent;struct _Node *lChild;struct _Node *rChild;ElemType data;}BiNode,*BiTree;//Link == 0 表示链接孩子的指针//Thread == 1 表示链接线索的指针typedef enum {Link,Thread} PointerTag;/*LTag == 0 lChild 域指示节点的左孩子LTag == 1 lChild 域指示结点的前驱RTag == 0 rChild 域指示结点的右孩子RTag == 1 rChild 域指示结点的后继*/typedef struct BiThrNode{TElemType data;struct BiThrNode *lChild,*rChild;PointerTag LTag;PointerTag RTag;}BiThrNode,*BiThrTree; #ifndef ThreadTree#define Node BiNode #define Tree BiTree #else#define Node BiThrNode#define Tree BiThrTree#endiftypedef struct _StackNode{ElemType data;int lchild;int rchild;int parents;}StackNode;#endif
0 0
- 线索二叉树 --->树
- 线索二叉树算法
- C#线索二叉树
- 线索二叉树
- C#线索二叉树
- 线索二叉树
- 线索二叉树
- 线索化二叉树
- 线索二叉树
- C#线索二叉树
- C#线索二叉树
- 线索二叉树
- 线索二叉树实例
- 线索二叉树
- 线索二叉树算法
- C++线索二叉树
- 线索二叉树
- 线索二叉树实现
- 第十六周用函数指针调用函数
- 导入excel数据时候的问题
- hadoop streaming
- CF卡上的Linux启动过程分析
- 网页视频播放器ckplayer
- 线索二叉树
- SVN服务器端配置
- OC类方法关于self的说明
- Mysql 基础知识
- Cocos2d-x 启动过程详解:渲染
- [笔记] 《Windows核心编程(第5版)》
- 第十六周项目一数字排序
- ruby学习之一(安装、第一个小程序“hello, world”)
- html标签嵌套——整合