关于二叉树的操作(一)
来源:互联网 发布:中国阶层固化 知乎 编辑:程序博客网 时间:2024/06/06 09:48
今天写的是二叉树的一些操作,这个应该会写两到三篇博客,还会牵连一些别的东西,以后都会写。一个简单的二叉树结点包括1个数据域,一个左孩子节点和一个右孩子节点。所以定义出一个结构体。
typedef char ElemType; typedef struct BtNode { BtNode *leftchild; BtNode *rightchild; ElemType data; }BtNode, *BinaryTree;
之后是创建节点和销毁二叉树的函数
BtNode * Buynode(){ BtNode *s = (BtNode*)malloc(sizeof(BtNode)); if(s == NULL) exit(1); memset(s,0,sizeof(BtNode)); return s;}void Freenode(BtNode *p){ free(p);}
之后二叉树的遍历方式,今天先写先序中序和后序的吧,使用递归比较容易,也可以非递归写,先写递归的吧,这个比较好理解,而且写起来简单
void PreOrder(BtNode *ptr){ if(ptr != NULL) { printf("%c ",ptr->data); PreOrder(ptr->leftchild); PreOrder(ptr->rightchild); }}void InOrder(BtNode *ptr){ if(ptr != NULL) { InOrder(ptr->leftchild); printf("%c ",ptr->data); InOrder(ptr->rightchild); }}void PastOrder(BtNode *ptr){ if(ptr != NULL) { PastOrder(ptr->leftchild); PastOrder(ptr->rightchild); printf("%c ",ptr->data); }}
使用递归就可以解决遍历问题但是如果不是用递归的话就需要用到栈来实现遍历。既然需要用到栈就需要一个东西来模拟一个栈
typedef BtNode * StackType;typedef struct{ StackType *data; int top; int maxsize;}Stack;
用这个结构体来模拟栈,data是一个数组,保存数据,top为栈顶指针,maxsize是栈的初始最大值,这个栈的各种操作的实现在另一篇里会写,现在就当已经实现了好了,毕竟这篇的重点是二叉树2333。
好了,回到遍历问题,我先写出代码。。。。
void NicePerOrder(BtNode *ptr){ if(NULL == ptr) return ; Stack st; Init_Stack(&st); push(&st,ptr); while(!empty(&st)) { ptr = top(&st); pop(&st); printf("%c ",ptr->data); if(ptr->rightchild != NULL) push(&st,ptr->rightchild); if(ptr->leftchild != NULL) push(&st,ptr->leftchild); }}void NiceInOrder(BtNode *ptr){ if(ptr == NULL) return ; Stack st; Init_Stack(&st); while(ptr != NULL || !empty(&st)) { while(ptr != NULL) { push(&st,ptr); ptr = ptr->leftchild; } ptr = top(&st); pop(&st); printf("%c ",ptr->data); ptr = ptr->rightchild; }}void NicePastOrder(BtNode *ptr){ if(ptr == NULL) return ; Stack st; Init_Stack(&st); BtNode *tag = NULL; while(ptr != NULL || !empty(&st)) { while(ptr != NULL) { push(&st,ptr); ptr = ptr->leftchild; } ptr = top(&st); pop(&st); if(ptr->rightchild == NULL || ptr->rightchild == tag) { printf("%c ",ptr->data); tag = ptr; ptr = NULL; } else { push(&st,ptr); ptr = ptr->rightchild; } }}
这就复杂了很多了。现在已经11:30了,作为在宿舍的苦逼学生党,我现在已经没网了,所以这篇那流量发了。。那么这样的话这个东西的解释就只好下篇再写了,这篇就先鸽了。。。。
阅读全文
0 0
- 关于二叉树的操作(一)
- 关于二叉树的一些操作(一)
- 二叉树的相关操作(一)
- 关于二叉树的操作
- 关于二叉树的相关操作
- 关于二叉树的一些操作
- 关于二叉树的一些操作
- 关于二叉树的相关操作汇总
- 数据结构关于二叉树的操作
- 关于二叉树的基本操作
- 关于二叉树的所有操作
- 关于二叉搜索树的一些操作
- (BST)二叉搜索树的操作(一)
- 二叉树的相关操作(一)-java
- 二叉树的基本操作(一)
- 一棵二叉树的基本操作
- 二叉树的基本操作(一)——二叉树的遍历
- 二叉查找树和AVL树的基本操作(AVL树就是一颗特殊的二叉查找树。)
- bzoj1601 [Usaco2008 Oct]灌水
- 用EasyBCD硬盘安装Ubuntu
- Unicode 和 UTF-8
- 文档中100个记的英文
- UVA
- 关于二叉树的操作(一)
- 2017/9/23周测(CF2016-2017 ACM-ICPC Pacific Northwest Regional Contest (Div. 2))
- UVA
- HDU 5699 货物运输 ( 二分 + 不等式判断 )
- Java9 中的Jshell 操作
- Qt 学习笔记--------------------使用纯代码写dialog 与 UI文件
- UVA
- Python客户端注册到服务中心Eureka
- mysql学习总结(三)