标签:style blog class code java color
这个代码其实自己花了很长的时间去理解,渐渐的有所明白了一点。
#include <stdio.h> #include <stdlib.h> typedef enum { Link , Thread } PointTag; //Link表示指针,Thread表示线索 typedef struct treenode //树的节点定义 { int data ; struct treenode * leftchild , * rightchild ; PointTag leftTag , rightTag ; } TreeNode ; TreeNode * CreactTree() //建立树 { TreeNode * T ; int data ; scanf("%d" , & data); if(0 == data) { T = NULL ; } else { T = (TreeNode *)malloc(sizeof(TreeNode)) ; T->data = data ; T->leftchild = CreactTree() ; T->rightchild = CreactTree() ; } return(T) ; } void InThreading(TreeNode * T,TreeNode **pre) //中序遍历线索化 { TreeNode * p ; p = T ; if(NULL != p) { InThreading(p->leftchild,pre) ; if(NULL == p->leftchild) { p->leftchild =(*pre); p->leftTag = Thread ; } else { p->leftTag = Link ; } if(NULL == (*pre)->rightchild) { (*pre)->rightchild = p ; (*pre)->rightTag = Thread ; } else { (*pre)->rightTag = Link ; } (*pre) = p ; InThreading(p->rightchild,pre) ; } } TreeNode * InOrdetThreading(TreeNode * T) //中序线索化二叉树 { TreeNode * Thrt , * * pre; pre = (TreeNode * *)malloc(sizeof(TreeNode *)) ; //用来传递前一个位置指针 (* pre) = (TreeNode *)malloc(sizeof(TreeNode)) ; Thrt = (TreeNode *)malloc(sizeof(TreeNode)) ; // 建立一个新的头节点 Thrt->leftchild = T ; Thrt->rightchild = Thrt ; (*pre) = Thrt ; InThreading(T,pre) ; //中序遍历并线索化 (*pre)->rightchild = Thrt ; (*pre)->rightTag = Thread ; Thrt->rightchild =(*pre) ; return(Thrt) ; } void InTravel(TreeNode * Thrt) { TreeNode * p ; p = Thrt->leftchild ; while(p != Thrt) { while(Link == p->leftTag) p = p->leftchild ; printf("%d " , p->data) ; while(Thread == p->rightTag && Thrt != p->rightchild) { p = p->rightchild ; printf("%d " , p->data) ; } p = p->rightchild ; } } int main() { TreeNode * T , * Thrt ; T = CreactTree() ; Thrt = InOrdetThreading(T) ; InTravel(Thrt) ; return 0 ; }
标签:style blog class code java color
原文地址:http://www.cnblogs.com/fengxmx/p/3710451.html