/* 创建二叉树 ----> 装入数据,---->遍历---> 显示 --->销毁*/
2005-04-15 20:46
337 查看
/*有错误 再想对策*/
/* twoTree.c*/
/* 创建二叉树 ----> 装入数据,---->遍历---> 显示 --->销毁*/#include <stdio.h>#include <malloc.h>#ifndef DEBUG#define DEBUG/******** **********************//*链栈, 判断 栈是否空,压栈,出栈*//*----------------------------------------------*/typedef int DataType;typedef DataType elementTypt;typedef struct Node{ DataType data; struct Node *LChild; struct Node *RChild; struct Node *Root;}Node;/*树的数据结构*//*==================================----*/typedef struct stackNode{ elementTypt data; struct stackNode * next;}stackNode;/* 栈的数据结构*/void TInitstack( stackNode * Top )/*初始化栈*/{ Top = ( stackNode *) malloc ( sizeof ( stackNode ) ); Top -> next = NULL; return;}int isEmpty( stackNode * Top )/* 是否空*/{ return ( Top -> next == NULL );}int TPush( stackNode * Top , elementTypt data )/*将元素 data 压入栈Top中,出错返回 1*/{ stackNode * Temp; Temp = ( stackNode * ) malloc( sizeof( stackNode ) ); if( !Temp ) { return 1; }/*空间分配失败返回*/ Temp -> data = data ; Temp -> next = Top -> next ; Top -> next = Temp; return 0;}int TPop( stackNode * Top , elementTypt * ptr ){ stackNode * Temp; Temp = Top -> next ; if( !Temp ) { return 1; }/*栈空返回 1 */ Top -> next = Temp -> next ; *ptr = Temp -> data ; free( Temp ); return 0 ;}/* creat tree */void Initiate( Node *root )/*初始化为空树*/{ root = ( Node * ) malloc( sizeof( Node ) ); root -> LChild = root -> RChild = NULL;}void Creat( Node *root , DataType data ){ if( root ) { root -> data = data ; return ; } root = ( Node * ) malloc( sizeof( Node ) ); root -> data = data ; root -> LChild = root -> RChild = NULL;}void Destory( Node *root )/* 销毁二叉数 root */{ stackNode *s ; Node *pre = root; TInitstack( s ); while( pre != NULL || !isEmpty(s) ) { if( pre ) { TPush( s , pre -> data ); pre = pre -> LChild; } else { TPop( s ,&( pre -> data) ); if( !pre -> RChild ) /* free 条件 !(pDel -> right && ! p->left) */ { Node *pDel = pre ; free ( pDel ); TPop( s , &( pre -> data ) ); } else { pre = pre -> RChild; } } } }/*对称编码 防止 漏标识符 */void Insert( Node *root , DataType data )/* 降顺序二叉数装入数据,左子树<右子树*/{ Node *p = root; if( root != NULL ) { Creat( root , data ) ; return ; } while( p ) { if( data < (p -> data) ) { p = p -> LChild; } else { p = p -> RChild; } /*相等的 将装数据到右孩子 */ } Creat( p , data );}void CreatTree( Node *root , DataType data , Node * LChild , Node *RChild ) /* 生成树结构:把节点连起来*/{ root -> LChild = LChild ; root -> RChild = RChild; root -> data = data; return;}void Visit( Node * p ){ printf("%d :", p -> data ); return;}void InOrder( Node * root )/*中序遍历二叉树*/{ /* add code */ stackNode * S ; Node *p = root ; TInitstack( S ); while(( p != NULL )|| (! isEmpty( S )) ) { if( p != NULL )/*根指针进栈*/ { TPush( S , (p -> data) ); p = p -> LChild; } else { TPop( S , &( p -> data ) ); Visit ( p ); p = p -> RChild; } } return; }#endif DEBUGvoid main(){ Node *Root ; int a=0. ch=0, i= 0; printf("InPut Root Data : "); scanf("%d",&a); getchar(); Creat( Root , a ); while( ch != '$' ) { ++i ; printf("Input %d Data : ", i); Insert( Root , ch ); ch = getchar() ; } getchar(); InOrder( Root ); Destory( Root ); return;}============================/* twoTree.cpp在 c++环境编译 ! 创建二叉树 ----> 装入数据,---->遍历---> 显示 --->销毁*都换用递归实现了 非递归实现还不怎么熟悉所以就*/#include <iostream.h>#ifndef DEBUG#define DEBUGtypedef int DataType;typedef struct Node{ DataType data; struct Node *LChild; struct Node *RChild;}Node;/*树的数据结构*//////////////////////////////////////////////////////////////Node * Initiate()/*初始化为空树*/{ Node *root = 0; return root ;}////////////////////////////////////////////////////////////////Node * Creat( DataType data ) /*建节点*/{ Node * Temp = new Node ; Temp -> data = data ; Temp -> LChild = 0 ; Temp -> RChild = 0; return Temp ;} /************************************************/void Insert( Node *&root , DataType data )//在c下不能这样 Node *&root/* 降顺序二叉数装入数据,左子树<右子树*/{ Node *p = Creat( data ); if( !root ) { root = p; } else if( p->data < root->data ) { Insert ( root->LChild , p->data ); } else { Insert ( root->RChild , p->data ); } /*相等的 将装数据到右孩子 */ }/****************************************************/ void PrintTree(Node * root) /*递归中序遍历 ---> 显示从小到大*/ { if( !root ) return ; PrintTree(root->LChild); cout<< root->data <<" :"; PrintTree( root->RChild ); return ;}/*********************************************************/void FreeTree(Node * root){ if( !root ) return; FreeTree(root -> LChild); FreeTree(root -> RChild); delete root;//跟节点要最后删!} #endif DEBUG///测试代码////////////void main(){ int a; Node *Root = Initiate() ; cout<<" -1 to exit: "<<endl; cin>>a; while( (a != -1)&&cin.good() ) //遇到非法输入同样退出循环 { Insert( Root , a ); cin>>a ; } if(!cin.good()) //输出错误信息 { cout<<" the type is error ! "<<endl; } PrintTree(Root); cout<<" ok ? "<<endl; FreeTree(Root);//销毁树 防止内存泄漏 return;}
/* twoTree.c*/
/* 创建二叉树 ----> 装入数据,---->遍历---> 显示 --->销毁*/#include <stdio.h>#include <malloc.h>#ifndef DEBUG#define DEBUG/******** **********************//*链栈, 判断 栈是否空,压栈,出栈*//*----------------------------------------------*/typedef int DataType;typedef DataType elementTypt;typedef struct Node{ DataType data; struct Node *LChild; struct Node *RChild; struct Node *Root;}Node;/*树的数据结构*//*==================================----*/typedef struct stackNode{ elementTypt data; struct stackNode * next;}stackNode;/* 栈的数据结构*/void TInitstack( stackNode * Top )/*初始化栈*/{ Top = ( stackNode *) malloc ( sizeof ( stackNode ) ); Top -> next = NULL; return;}int isEmpty( stackNode * Top )/* 是否空*/{ return ( Top -> next == NULL );}int TPush( stackNode * Top , elementTypt data )/*将元素 data 压入栈Top中,出错返回 1*/{ stackNode * Temp; Temp = ( stackNode * ) malloc( sizeof( stackNode ) ); if( !Temp ) { return 1; }/*空间分配失败返回*/ Temp -> data = data ; Temp -> next = Top -> next ; Top -> next = Temp; return 0;}int TPop( stackNode * Top , elementTypt * ptr ){ stackNode * Temp; Temp = Top -> next ; if( !Temp ) { return 1; }/*栈空返回 1 */ Top -> next = Temp -> next ; *ptr = Temp -> data ; free( Temp ); return 0 ;}/* creat tree */void Initiate( Node *root )/*初始化为空树*/{ root = ( Node * ) malloc( sizeof( Node ) ); root -> LChild = root -> RChild = NULL;}void Creat( Node *root , DataType data ){ if( root ) { root -> data = data ; return ; } root = ( Node * ) malloc( sizeof( Node ) ); root -> data = data ; root -> LChild = root -> RChild = NULL;}void Destory( Node *root )/* 销毁二叉数 root */{ stackNode *s ; Node *pre = root; TInitstack( s ); while( pre != NULL || !isEmpty(s) ) { if( pre ) { TPush( s , pre -> data ); pre = pre -> LChild; } else { TPop( s ,&( pre -> data) ); if( !pre -> RChild ) /* free 条件 !(pDel -> right && ! p->left) */ { Node *pDel = pre ; free ( pDel ); TPop( s , &( pre -> data ) ); } else { pre = pre -> RChild; } } } }/*对称编码 防止 漏标识符 */void Insert( Node *root , DataType data )/* 降顺序二叉数装入数据,左子树<右子树*/{ Node *p = root; if( root != NULL ) { Creat( root , data ) ; return ; } while( p ) { if( data < (p -> data) ) { p = p -> LChild; } else { p = p -> RChild; } /*相等的 将装数据到右孩子 */ } Creat( p , data );}void CreatTree( Node *root , DataType data , Node * LChild , Node *RChild ) /* 生成树结构:把节点连起来*/{ root -> LChild = LChild ; root -> RChild = RChild; root -> data = data; return;}void Visit( Node * p ){ printf("%d :", p -> data ); return;}void InOrder( Node * root )/*中序遍历二叉树*/{ /* add code */ stackNode * S ; Node *p = root ; TInitstack( S ); while(( p != NULL )|| (! isEmpty( S )) ) { if( p != NULL )/*根指针进栈*/ { TPush( S , (p -> data) ); p = p -> LChild; } else { TPop( S , &( p -> data ) ); Visit ( p ); p = p -> RChild; } } return; }#endif DEBUGvoid main(){ Node *Root ; int a=0. ch=0, i= 0; printf("InPut Root Data : "); scanf("%d",&a); getchar(); Creat( Root , a ); while( ch != '$' ) { ++i ; printf("Input %d Data : ", i); Insert( Root , ch ); ch = getchar() ; } getchar(); InOrder( Root ); Destory( Root ); return;}============================/* twoTree.cpp在 c++环境编译 ! 创建二叉树 ----> 装入数据,---->遍历---> 显示 --->销毁*都换用递归实现了 非递归实现还不怎么熟悉所以就*/#include <iostream.h>#ifndef DEBUG#define DEBUGtypedef int DataType;typedef struct Node{ DataType data; struct Node *LChild; struct Node *RChild;}Node;/*树的数据结构*//////////////////////////////////////////////////////////////Node * Initiate()/*初始化为空树*/{ Node *root = 0; return root ;}////////////////////////////////////////////////////////////////Node * Creat( DataType data ) /*建节点*/{ Node * Temp = new Node ; Temp -> data = data ; Temp -> LChild = 0 ; Temp -> RChild = 0; return Temp ;} /************************************************/void Insert( Node *&root , DataType data )//在c下不能这样 Node *&root/* 降顺序二叉数装入数据,左子树<右子树*/{ Node *p = Creat( data ); if( !root ) { root = p; } else if( p->data < root->data ) { Insert ( root->LChild , p->data ); } else { Insert ( root->RChild , p->data ); } /*相等的 将装数据到右孩子 */ }/****************************************************/ void PrintTree(Node * root) /*递归中序遍历 ---> 显示从小到大*/ { if( !root ) return ; PrintTree(root->LChild); cout<< root->data <<" :"; PrintTree( root->RChild ); return ;}/*********************************************************/void FreeTree(Node * root){ if( !root ) return; FreeTree(root -> LChild); FreeTree(root -> RChild); delete root;//跟节点要最后删!} #endif DEBUG///测试代码////////////void main(){ int a; Node *Root = Initiate() ; cout<<" -1 to exit: "<<endl; cin>>a; while( (a != -1)&&cin.good() ) //遇到非法输入同样退出循环 { Insert( Root , a ); cin>>a ; } if(!cin.good()) //输出错误信息 { cout<<" the type is error ! "<<endl; } PrintTree(Root); cout<<" ok ? "<<endl; FreeTree(Root);//销毁树 防止内存泄漏 return;}
相关文章推荐
- ::递归实现——创建二叉树 ----> 装入数据--->遍历---> 显示 --->销毁
- 【数据结构与算法】(六) c 语言实现简单的二叉树静态创建及先序、中序、后序遍历
- 二叉树(2)二叉树创建的3种方法,二叉树的递归遍历,二叉树的销毁
- 数据结构中顺序栈的基本函数运用,包括创建空栈,初始化,清空,销毁,增加,删除,遍历等函数
- 动态创建CHECKBOX,定位显示,遍历写入数据保存数据
- 二叉树(2)二叉树创建的3种方法,二叉树的递归遍历,二叉树的销毁
- 数据结构之二叉树创建与遍历
- 【二叉树】二叉树的创建、遍历、销毁、求树的最大深度
- mysql导入导出数据中文乱码解决方法小结(1、navicat导入问题已解决,创建连接后修改连接属性,选择高级->将使用Mysql字符集复选框去掉,下拉框选择GBK->导入sql文件OK;2、phpmyadmin显示乱码的问题也解决,两步:1.将sql文件以utf8的字符集编码另存,2.将文件中sql语句中的字段字符集编码改成utf8,导入OK)
- 2136-->数据结构实验之二叉树的建立与遍历
- 数据结构问题根据广义表创建二叉树的四种遍历方式
- 数据结构与算法分析学习笔记--第四章(二叉树:创建、递归遍历、非递归遍历、根据数据删除结点等)
- 数据结构——二叉树的创建和遍历
- 数据结构—二叉树的创建 遍历 输出
- JQuery将DataTable list<>数据转换成JSON数据 动态创建表格显示数据
- 链式二叉树的后序创建、递归后序遍历、非递归堆栈后序遍历、后序销毁
- 二叉树的创建,遍历,求高度,算出节点数,算出叶子节点数,左右子树的交换,二叉树的销毁。
- 二叉树的创建、销毁、各种递归、循环遍历方法(可运行测试)
- 二叉树创建,遍历,销毁,深度.....
- 二叉树创建以及遍历(j简单创建、遍历、叶子计数、深度计数、销毁)之1