二叉树顺序结构实现/链式结构实现
2014-12-10 11:32
411 查看
程杰《大话数据结构》这部分的源码乱起八糟的。自己总结下:
顺序结构:
链式结构:
要注意的地方是:
链式结构是递归创建,且结束符是#.
如果初始创建是1233456############这种的话,其实是一个左斜树。最后中序遍历和后续遍历结果是一样的,都是前序遍历的倒序。
因为我分不清应该有几个#结尾,所以干脆打了很多结尾符。但是这样就能得到正确直观的遍历。
顺序结构:
#include "stdafx.h" #include "string.h" #include "stdio.h" #include "stdlib.h" #include <iostream> using namespace std; #define ok 1 #define error 0 #define true 1 #define false 0 #define MAXSIZE 100 #define MAX_TREE_SIZE 100 typedef int TElemType; //typedef TElemType SqBiTree[MAX_TREE_SIZE];//顺序结构 相当于是数组 结构 #define MAX_NODE_SIZE 100 //二叉树的最大节点数 typedef char SqBiTree[MAX_NODE_SIZE+1]; //0号单元节点个数 //创建二叉树 void creat_tree(SqBiTree &t) { int i=0; char ch; while((ch=getchar())!='$') { i++; t[i]=ch; } t[0]=i; } //获取给定结点(位置)的左孩子的结点位置 int LeftChild_locate(SqBiTree &t,int node) { if ((2 * node) > t[0]) return -1; else return 2 * node; } //获取给定结点(位置)的右孩子的结点位置 int RightChild_locate(SqBiTree &t,int node) { if ((2 * node+1) > t[0]) return -1; else return 2 * node+1; } //层序遍历 void level_order(SqBiTree &t) { for(int i=1;i<=t[0];i++) if(t[i]!='$') cout<<t[i]<<" "; } //先序遍历 void pre_order(SqBiTree &t,int i) { if(t[0]<=0) { cout<<"空树!"<<endl; } else { if(t[i]!='$') cout<<t[i]<<" "; if(LeftChild_locate(t,i)!=-1) //如果左子结点存在,递归 pre_order(t,LeftChild_locate(t,i)); if(RightChild_locate(t,i)!=-1) //如果右子结点存在,递归 pre_order(t,RightChild_locate(t,i)); } } //中序遍历 void mid_order(SqBiTree &t,int i) { if(t[0]<=0) { cout<<"空树!"<<endl; } else { if(LeftChild_locate(t,i)!=-1) //如果左子结点存在,递归 mid_order(t,LeftChild_locate(t,i)); if(t[i]!='$') cout<<t[i]<<" "; if(RightChild_locate(t,i)!=-1) //如果右子结点存在,递归 mid_order(t,RightChild_locate(t,i)); } }//后序遍历 void back_order(SqBiTree &t,int i) { if(t[0]<=0) { cout<<"空树!"<<endl; } else { if(LeftChild_locate(t,i)!=-1) //如果左子结点存在,递归 back_order(t,LeftChild_locate(t,i)); if(RightChild_locate(t,i)!=-1) //如果右子结点存在,递归 back_order(t,RightChild_locate(t,i)); if(t[i]!='$') cout<<t[i]<<" "; } } int main() { cout<<"创建二叉树:"<<endl; SqBiTree sbt; //创建顺序二叉树 creat_tree(sbt); //层序遍历 cout<<"层序遍历:"<<endl; level_order(sbt); cout<<endl; //先序遍历 cout<<"前序遍历:"<<endl; pre_order(sbt,1); cout<<endl; //中序遍历 cout<<"中序遍历:"<<endl; mid_order(sbt,1); cout<<endl; //后续遍历 cout<<"后序遍历:"<<endl; back_order(sbt,1); cout<<endl; cout<<LeftChild_locate(sbt,3); system("pause"); return 0; }
链式结构:
#include "stdafx.h" #include "stdio.h" #include "io.h" #include "string.h" #include"stdlib.h"//除了内存分配的 malloc free new delete这些还有 system pause的命令也归这个关啊 typedef struct BiNode { char data; struct BiNode *lchild,*rchild; }BiNode,*LinkBiTree; //递归构建链式二叉树 void CreatTree(LinkBiTree &T) { char ch; //printf("创建链式二叉树"); ch=getchar(); if(ch=='#') {T=NULL; return;} else { T=new BiNode; T->data=ch; CreatTree(T->lchild); CreatTree(T->rchild);//一直建立左子树,直到左子树建立完了,#表示建立完了,建立右子树,这是前序遍历的方式建立的 } } void preorder(LinkBiTree &T) { if(T==NULL) return; else {printf("%c ",T->data); preorder(T->lchild); preorder(T->rchild);} } void midorder(LinkBiTree &T) { if(T==NULL) return; else { midorder(T->lchild); printf("%c ",T->data); midorder(T->rchild);} } void backorder(LinkBiTree &T) { if(T==NULL) return; else { backorder(T->lchild); backorder(T->rchild); printf("%c ",T->data);} } int main() { LinkBiTree T; CreatTree(T); //前序遍历 preorder(T); printf("\n"); //中序遍历 midorder(T); printf("\n"); //后续遍历 backorder(T); printf("\n"); system("pause"); return 0; }
要注意的地方是:
链式结构是递归创建,且结束符是#.
如果初始创建是1233456############这种的话,其实是一个左斜树。最后中序遍历和后续遍历结果是一样的,都是前序遍历的倒序。
因为我分不清应该有几个#结尾,所以干脆打了很多结尾符。但是这样就能得到正确直观的遍历。
相关文章推荐
- [数据结构]顺序二叉树的实现
- 顺序表链式结构实现多项式相加。参照《数据结构》中的伪代码
- 数据结构之---C语言实现二叉树的顺序存储
- 大话数据结构 code 第五章 02二叉树链式结构实现_BiTreeLink
- Java单链表顺序和链式实现(数据结构五)
- 数据结构2----线性表顺序存储和链式存储的实现(霜之小刀)
- 二叉树链式结构C代码实现
- 二叉树的链式存储结构 前序 后序 中序 层序遍历操作实现 判断是否完全二叉树
- 二叉树的链式结构递归遍历实现
- 顺序表的链式结构中用C语言实现单链表的交并差运算
- 二叉树的顺序结构C语言实现
- 【数据结构】二叉树顺序结构实现_BiTreeArray
- 数据结构与算 5:C++ 顺序/链式存储,栈 模板类实现,编译模板类问题解决
- 线性结构的顺序存储和链式存储的实现代码(二)
- 数据结构把顺序存储的二叉树转换成链式存储及前序,中序,后序遍历
- 顺序结构实现二叉树的建立和各种遍历
- 数据结构——二叉树的链式实现(C语言)
- 二叉树的链式存储结构 C++代码实现
- 栈的实现(顺序结构&&链式结构)
- 二叉树顺序结构实现