二叉树顺序结构实现/链式结构实现

程杰《大话数据结构》这部分的源码乱起八糟的。自己总结下:

顺序结构:

#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############这种的话,其实是一个左斜树。最后中序遍历和后续遍历结果是一样的,都是前序遍历的倒序。

因为我分不清应该有几个#结尾,所以干脆打了很多结尾符。但是这样就能得到正确直观的遍历。

时间: 2024-10-12 22:14:54

二叉树顺序结构实现/链式结构实现的相关文章

栈和队列分别的顺序结构和链式结构

栈和队列 栈和队列本身作为特殊的线性表,要记住他俩本身就费劲.难受的是他俩还能分别考虑顺序结构和链式结构,很复杂,容易混淆. 其实比起FILO(先进后出)和FIFO(先进先出)等特点,更重要的是对指针的把握.进出顺序是在逻辑层面的,只要理解就行,难得是如何用指针来表示这种特点,于是我就此方面进行个总结. 顺序栈 虽然栈只需要对一段进行操作(栈顶),但我们除了栈顶指针(top)外,还需要设置栈底指针(base),主要是为了用于判断栈空栈满. s.top == s.base; //当栈顶指针等于栈底

顺序结构与链式结构

摘抄自,严蔚敏<算法与数据结构> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

栈的顺序结构和链式结构实现

1.栈的顺序存储<数组实现> 1.1.栈的接口 1 package com.neusoft.stack; 2 3 public interface IStack { 4 //1.栈置空 5 public void clear(); 6 //2.栈判空 7 public boolean isEmpty(); 8 //3.栈长度 9 public int length(); 10 //4.取栈顶元素 11 public Object peek(); 12 //5.移除栈顶元素-----出栈 13

数据结构----线性表顺序和链式结构的使用(c)

PS:在学习数据结构之前,我相信很多博友也都学习过一些语言,比如说java,c语言,c++,web等,我们之前用的一些方法大都是封装好的,就java而言,里面使用了大量的封装好的方法,一些算法也大都写好了,java还有三个特性,封装.继承.多态.当然这里不是讲Java,这里主要是说内部结构,大家都知道数据结构有些东西是分为逻辑结构和物理结构的,物理结构有分为顺序结构和链式结构,有不懂得可以百度百科,这里主要是分享线性表的顺序结构.那么什么是线性表呢,线性表是最基本.最简单.也是最常用的一种数据结

线性表的顺序存储结构和链式存储结构

前言 上一篇<栈>中提到了栈的顺序存储结构和链式存储结构,现在就对此做个简单的比较.因为栈是线性表的一种,顺序存储结构和链式存储结构实际是线性表的两种存储方式.而栈和队列都是两种重要的线性表结构.所以本文标题直接为线性表的顺序存储结构和链式存储结构. 开始比较两种不同的存储方式 一.顺序存储结构(也可称为顺序表) 顺序表的特点是逻辑上相邻的数据元素,物理存储位置也相邻,并且,顺序表的存储空间需要预先分配. 优点: (1)方法简单,各种高级语言中都有数组,容易实现. (2)不用为表示节点间的逻辑

数据结构-线性表的链式结构

线性表的链式结构,与之前说过的线性表的顺序结构差不多,区别在于存储结构和方式的不一样. 在链式中,来一个数据就去寻找一个空间存储一个结点有多少数据占多大的地方,是动态的存储方式.另外顺序表如果存储1MB就只占1MB存储空间,但是链式表不一样,它会有额外的空间去存储对应结点的指针. 这样一分析结构就出来了,链式结构为两部分:1.结点域.2.指针域.实现方法用动态存储. 1 #include "stdio.h" 2 #include "stdlib.h" 3 4 typ

顺序存储结构与链式存储结构

上一篇博客简单讲述了一下两种结构的概念这一篇博客主要想讲述一下他们之间的区别 顺序存储结构与链式存储结构的优缺点 顺序存储结构 概念官方一点来说可以使用百度百科的介绍:顺序存储结构是存储结构类型中的一种,该结构是把逻辑上相邻的结点存储在物理位置上相邻的存储单元中,结点之间的逻辑关系由存储单元的邻接关系来体现. 当然不得不说一般这种官方的解释都是不太适合我的,所以用小甲鱼的方式来说这个概念的话,简单来说就是,用一段连续的地址存放数据元素,数据间的逻辑关系和物理关系相同. 优点1:存储密度大,空间利

不要打断链式结构:使用 RxJava的 compose() 操作符

不要打断链式结构:使用 RxJava的 compose() 操作符

文件上传以及JS链式结构

文件上传: 文件上传使用FileUpload控件,使用控件的SaveAs方法,需要绝对路径. 获取文件的绝对路径:Server.MapPath(相对路径); 或许要上传文件的本身名字用.FileName获取. 因为名字相同的文件将会被直接覆盖,所以一般文件名字要拼接上传时间和用户名保证不重名. 上传文件默认最大为4MB,在C#端限制文件大小有缺陷,一般用JS端限制. 获取要上传的文件通过ID获取FileUpload控件然后通过value值获取文件然后通过.length属性确定是否有文件要上传,然