当前位置:首页 » 存储配置 » 创建二叉树的链表存储结构

创建二叉树的链表存储结构

发布时间: 2022-07-11 09:35:10

⑴ 二叉树的链式存储结构的数据结构定义、创建、先序和后序遍历,并将结果序列输出。

1、建立一个单链表,并从屏幕显示单链表元素列表。

2、从键盘输入一个数,查找在以上创建的单链表中是否存在该数;如果存在,显示它的位置;如果不存在,给出相应提示。

3、在上述的单链表中的指定位置插入指定的元素

4、删除上述单链表中指定位置的元素。

源程序:头文件

#include<iostream.h>
#include<malloc.h>
typedef char ElemType;
typedef int Status;
#define OK 1
#define ERROR 0
typedef struct LNode{
ElemType data;
LNode *next;
}LNode,*LinkList;

void about(){ //版本信息
cout<<"单链表的操作"
}

void showmenu(){ //功能列表
cout<<endl <<" **********功能**********"<<endl
<<" * 1.输出单链表的全部数据*"<<endl
<<" * 2.查找链表元素 *"<<endl
<<" * 3.链表插入元素 *"<<endl
<<" * 4.链表删除元素 *"<<endl
<<" * 5.结束 *"<<endl
<<" ************************"<<endl
<<"请输入所需功能: ";
}

//*******查看输入的全部数据*********
void PrintList(LinkList L){
LinkList p;
cout<<endl<<"你输入的数据为: ";
p=L->next; //从头结点开始扫描
while(p){ //顺指针向后扫描,直到p->next为NULL或i=j为止
cout<<p->data;
p=p->next; }
cout<<endl; }

//逆序输入 n 个数据元素,建立带头结点的单链表
void CreateList_L(LinkList &L, int n) {
int i;
LinkList p;
L = new LNode;
L->next = NULL; // 先建立一个带头结点的单链表
cout<<"逆序输入 n 个数据元素,建立带头结点的单链表"<<endl;
for (i = n; i > 0; --i) {
p = new LNode;
cin>>p->data; // 输入元素值
p->next = L->next; L->next = p; // 插入
}
}

// L是带头结点的链表的头指针,以 e 返回第 i 个元素
Status GetElem_L(LinkList L, int i, ElemType &e) {
int j;
LinkList p;
p = L->next; j = 1; // p指向第一个结点,j为计数器
while (p && j<i) { p = p->next; ++j; } // 顺指针向后查找,直到 p 指向第 i 个元素或 p 为空
if ( !p || j>i )
return ERROR; // 第 i 个元素不存在
e = p->data; // 取得第 i 个元素
return OK;
}

// 本算法在链表中第i 个结点之前插入新的元素 e
Status ListInsert_L(LinkList L, int i, ElemType e) {
int j;
LinkList p,s;
p = L; j = 0;
while (p && j < i-1)
{ p = p->next; ++j; } // 寻找第 i-1 个结点
if (!p || j > i-1)
return ERROR; // i 大于表长或者小于1
s = new LNode; // 生成新结点
if ( s == NULL) return ERROR;
s->data = e;
s->next = p->next; p->next = s; // 插入
return OK;
}

Status ListDelete_L(LinkList L, int i, ElemType &e)
{LinkList p,q;
int j;
p = L; j = 0;
while (p->next && j < i-1) { p = p->next; ++j; }
// 寻找第 i 个结点,并令 p 指向其前趋

if (!(p->next) || j > i-1)
return ERROR; // 删除位置不合理
q = p->next; p->next = q->next; // 删除并释放结点
e = q->data; free(q);
return OK;
}

#include"LinkList.h"
void main()
{LinkList L;
int n,choice,i;
ElemType e;
about();
cout<<"请输入链表中元素的个数";
cin>>n;
CreateList_L(L, n);
showmenu(); //功能列表
cin>>choice;
while(choice!=5)
{ //输入时候退出程序
switch(choice){
case 1:PrintList(L);break; //1.查看输入的全部数据
case 2:{
cout<<"输入你要查找的元素的位置: ";
cin>>i;GetElem_L(L, i, e);
cout<<"第"<<i<<"个元素的值是"<<e<<endl;
break;} //2.查找链表元素
case 3:
{cout<<"请输入你要插入元素的位置i: ";
cin>>i;
cout<<endl<<"请输入你要插入元素的值: ";
cin>>e;
ListInsert_L(L, i,e);
break;} //3.链表插入元素
case 4:
{cout<<"请输入你要删除元素的位置";
cin>>i;
ListDelete_L(L, i, e) ;
break;} //4.链表删除元素
default:cout<<"输入错误,请输入-5,输入重显示功能表^_^ "<<endl;
}
cout<<endl<<"输入功能序号:";
cin>>choice;
}

}

⑵ 二叉树采用链表存储结构,实现建立、遍历(先序、中序、后序)、求结点总数、叶子数、度为1.2的结点数。

前几天写的,输入二叉树的广义表形式,建立二叉树的链式存储。输出的是中序。有注释。例如输入:a(b,c(d,e(f)),g,h(i))
#include<stdio.h>
#include<stdlib.h>
int n=0; //全局变量
struct tree //二叉树结构体
{
char data;
struct tree *lc;
struct tree *rc;
};
tree *creat(char a[]) //创建树的二叉树
{
tree *h;
h=(tree *)malloc(sizeof(tree));
h->lc=NULL;
h->rc=NULL;
if(a[n]!=')'&&a[n]!='('&&a[n]!=',') //当a[n]为字母存入a[]
{
h->data=a[n];
n++;
}
if(a[n]=='(') //a[n]为左括号对h->lc递归操作
{
n++;
h->lc=creat(a);
}
if(a[n]==',') //a[n]为逗号对h->rc递归操作
{
n++;
h->rc=creat(a);
return h;
}
if(a[n]==')') //a[n]为右括号返回h
{
n++;
return h;
}
else
return h;

}
void print(tree *h) //二叉树中序输出
{
if(h!=NULL)
{
print(h->lc);
printf("%c",h->data);
print(h->rc);
}

}

int high(char a[]) //判断树的高度
{
int i=0,max=0,p=0;
while(a[i]!=0)
{
if(a[i]=='(')
{
p++;
if(max<i)
max=p;
}
if(a[i]==')')
p--;
i++;
}
if(p!=0)
{
printf("左右括号数不等,输入错误\n"); //判断左右括号数是否相等
exit(1);
}
return max+1;
}
void main() //主函数
{
int i=0;
tree *h;
char a[50]={0};
gets(a);
while(a[i]!=0) //判断各种可能出现的输入错误
{

if(i==0&&(a[i]=='('||a[i]==')'||a[i]==',')) //判断数组首元素是否为字母
{
printf("首节点错误\n");
exit(1);
}
if(a[i]=='(') //左括号之前一定是字母
{
if(a[i-1]=='('||a[i-1]==')'||a[i-1]==',')
{
printf("输入错误\n");
exit(1);
}
}
if(a[i]!='('&&a[i]!=')'&&a[i]!=',') //两个字母不能在一起
{
if(a[i+1]!='('&&a[i+1]!=')'&&a[i+1]!=',')
{
printf("输入错误,两个字母不能在一起\n");
exit(1);
}
}
i++;
}
h=creat(a); //创建树
printf("该树的高度为:%d\n",high(a));
printf("该二叉树的中序输出为:");
print(h);
printf("\n");
}

⑶ 用C语言编写:建立一棵以二叉链表结构存储的二叉树,并对其进行遍历。求该二叉树中的结点个数等操作。

存储结构
typedef struct {
int weight;
int parent, lchild, rchild;
} HTNode ,*HuffmanTree; // 动态分配数组存储huffman树
算法设计
void createHuffmantree(){
ht=(HuffmanTree)malloc(m+1)*sizeof(HTNode);// 动态分配数组存储huffman树,0号单元未用
// m:huffman 树中的结点数(m=2*n-1)
for (i=1;i<=m;++i)
ht[i].parent= ht[i]->lch= ht[i]->rch=0;
for (i=1;i<=n;++i)
ht[i].weight=w[i]; //初始化,w[i]:n个叶子的权值
for (i=n+1;i<=m,++i) { //建哈夫曼树
select(i-1),s1,s2); //在ht[k](1<=k<=i-1)中选择两个双亲域为零而权值取最小的结点 :s1和s2
ht[s1].parent= ht[s2].parent=i;
ht[i].lch=s1;
ht[i].rch=s2;
ht[i].weight=ht[s1].weight + ht[s2].weight ;
};
}

⑷ 编写程序,用先序递归遍历法建立二叉树的二叉链表存储结构,输出其先序、中序、后序遍历第k个访问结点

#include "stdio.h"

#include "malloc.h"

#define ELEMTYPE char

BiTNode *bulid() /*建树*/

{ BiTNode *q;

BiTNode *s[20];

int i,j;

char x;

printf("请按顺序输入二叉树的结点以输入0和*号结束 ");

printf("请输入要输入的为第几个结点i= ");

scanf("%d",&i);

printf("请输入你要输入该结点的数为x=");

getchar();

scanf("%c",&x);

while(i!=0&&x!='*')

{q=(BiTNode*)malloc(sizeof(BiTNode));

q->data=x;

q->rchild=NULL;

q->lchild=NULL;

case(1): preoder(bt); goto k1;

case(2): InOrder(bt); goto k1;

case(3): postOrder(bt); goto k1;

case(0): break;

root=(struct lbtree *)malloc(sizeof(struct lbtree));

root->data=ch;

root->lchild=createbtree();

root->rchild=createbtree();

return(root);

}

dl=treedepth(root->lchild);

dr=treedepth(root->rchild);

if(dl>dr)depth=dl+1;

else depth=dr+1;

(4)创建二叉树的链表存储结构扩展阅读:

(1)完全二叉树——若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树。

(2)满二叉树——除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树。

(3)平衡二叉树——平衡二叉树又被称为AVL树(区别于AVL算法),它是一棵二叉排序树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

⑸ 编写一个建立二叉树的算法,要求采用二叉链表存储结构

typedef struct node
{
char data;
struct node *lchild,*rchild;
}node,*bitptr;
bitptr creat(void)
{
bitptr root;
char c;
cin

⑹ 建立任意二叉树的二叉链表存储,并对其进行先序、中序、后序遍历。

#include "stdio.h"
#include "stdlib.h"
#define STACK_INIT_SIZE 10 //栈的初始长度
#define STACKINCREMENT 5 //栈的追加长度

typedef struct bitree{
char data;
struct bitree *lchild,*rchild;
}bitree; //二叉树结点定义

typedef struct {
bitree **base;
bitree **top;
int stacksize;
}sqstack; // 链栈结点定义top栈顶 base栈底 且栈元素是指向二叉树结点的二级指针
//建立一个空栈
int initstack(sqstack *s)
{s->base=(bitree *)malloc(STACK_INIT_SIZE*sizeof(bitree)); //栈底指向开辟空间
if(!s->base) exit(1); //抛出异常
s->top=s->base; //栈顶=栈尾 表示栈空
s->stacksize=STACK_INIT_SIZE; //栈长度为开辟空间大小
return 1;
}
//进栈
int push(sqstack *s,bitree *e)
{if(s->top-s->base>=s->stacksize) //如果栈满 追加开辟空间
{s->base=(bitree *)realloc (s->base,(s->stacksize+STACKINCREMENT)* sizeof(bitree));
if(!s->base) exit(1); //抛出异常
s->top=s->base+s->stacksize; //感觉这一句没用
s->stacksize+=STACKINCREMENT;}
*(s->top)=e;s->top++; //进栈 栈顶后移
return 1;
}
//出栈
int pop(sqstack *s,bitree **e)
{if(s->top==s->base) return 0; //栈空 返回0
--s->top;*e=*(s->top); //栈顶前移 取出栈顶元素给e
return 1;}
//取栈顶
int gettop(sqstack *s,bitree **e) //去栈顶元素 注意top指向的是栈顶的后一个
{if(s->top==s->base) return 0; //所以 s->top-1
*e=*(s->top-1);
return 1;
}
/*------------------------非递归-----先序建立二叉树----------------------------------*/
bitree *createprebitree()
{char ch;bitree *ht,*p,*q;
sqstack *s;
s=malloc(sizeof(bitree)); //加上这一句为s 初始化开辟空间
ch=getchar();
if(ch!='#'&&ch!='\n') /* 输入二叉树先序顺序 是以完全二叉树的先序顺序
不是完全二叉树的把没有的结点以#表示 */
{ht=(bitree *)malloc(sizeof(bitree));
ht->data=ch;
ht->lchild=ht->rchild=NULL;
p=ht;
initstack(s);
push(s,ht); //根节点进栈
while((ch=getchar())!='\n') // 算
{if(ch!='#') {q=(bitree *)malloc(sizeof(bitree)); // 法
q->data=ch; //
if(p==*(s->top-1)) p->lchild=q; // 核
else p->rchild=q; //
push(s,q);p=q; // 心
} //
else {if(p==*(s->top-1)) p->lchild=NULL; // 的
else p->rchild=NULL; //
pop(s,&p);} // 步
//
} // 骤
return ht;
}
else return NULL;
}
/*--------------------------递归---------先序建立二叉树-------------------------------*/
void CreateBiTree(bitree **T) {
//按先序次序输入二叉树中的结点的值(一个字符),空格字符表示空树,
//构造二叉链表表示二叉树
char ch;
scanf("%c",&ch);
if(ch=='#') *T=NULL;
else{
*T=(bitree * )malloc(sizeof(bitree));
if(!*T) exit(1);
(*T)->data=ch; //生成根结点
CreateBiTree(&(*T)->lchild); //构造左子树
CreateBiTree(&(*T)->rchild); //构造右子树
}
}
/*--------------------------非递归-------中序建立二叉树-------------------------------*/
/*--------------------------递归---------中序建立二叉树-------------------------------*/
/*--------------------------非递归-------后序建立二叉树-------------------------------*/
/*--------------------------递归---------后序建立二叉树-------------------------------*/

/*-----------------------非递归------先序输出二叉树------------------------------*/
void preordertraverse(bitree *h)
{sqstack m;
initstack(&m);
while(h||m.base!=m.top)
{if(h) {push(&m,h);printf("%c",h->data);h=h->lchild;}
else{pop(&m,&h);
h=h->rchild;}
}
}
/*------------------------非递归-----中序输出二叉树----------------------------*/
void inordertraverse(bitree *h)
{sqstack m;
initstack(&m);
while(h||m.base!=m.top)
{if(h) {push(&m,h);h=h->lchild;}
else {
pop(&m,&h);
printf("%c",h->data);
h=h->rchild;
}
}
}
/*---------------------非递归----后序遍历二叉树----------------------------------*/
void postordertraverse(bitree *h)
{
sqstack m;
initstack(&m);
while(h||m.base!=m.top)
{if(h) {
push(&m,h);
h=h->lchild;}
else {
bitree *r; //使用r结点表示访问了右子树 代替标志域
gettop(&m,&h);
if(h->rchild&&h->rchild!=r)
{h=h->rchild;
push(&m,h);
h=h->lchild;}
else{pop(&m,&h);
printf("%c",h->data);
r=h;h=NULL;}
}
}
}
//层次遍历二叉树 用队列 哈哈以后做
/*-------------------------------主过程-------------------------------*/
int main()
{bitree *ht;
printf("先序非递归建立一个二叉树:");
if((ht=createprebitree())!=NULL) //非递归建立
//CreateBiTree(&ht);
//if(ht!=NULL) //递归建立
{
printf("先序遍历输出二叉树:");
preordertraverse(ht);
putchar('\n');
printf("中序遍历输出二叉树:");
inordertraverse(ht);
putchar('\n');
printf("后序遍历输出二叉树:");
postordertraverse(ht);
putchar('\n');
}
else printf("空二叉树\n");
}
这是先序递归和非递归建立二叉树 和 先、中、后 的遍历输出

⑺ 用C语言定义二叉树的二叉链表存储结构,完成二叉树的建立,先序中序后序遍历的操作,求所有叶子结点总数

#include<stdio.h>

#include<malloc.h>


typedef int ElemType;


typedef struct LNode{

ElemType data;

struct LNode *lchild,*rchild;

}LNode,*TLNode;


void create(TLNode * Tree){ //创建

ElemType e;

scanf("%d",&e);

if(e==0)

*Tree=NULL;

else{

(*Tree)=(TLNode)malloc(sizeof(LNode));

(*Tree)->data=e;

printf("input %d lchild: ",e);

create(&(*Tree)->lchild);

printf("input %d rchild: ",e);

create(&(*Tree)->rchild);

}

}


void print1(TLNode Tree){ //先序遍历

if(Tree!=NULL){

printf("%d-",Tree->data);

print1(Tree->lchild);

print1(Tree->rchild);

}

}


void print2(TLNode Tree){ //中序遍历

if(Tree!=NULL){

print2(Tree->lchild);

printf("%d-",Tree->data);

print2(Tree->rchild);

}

}

void print3(TLNode Tree){ //后序遍历

if(Tree!=NULL){

print3(Tree->lchild);

print3(Tree->rchild);

printf("%d-",Tree->data);

}

}


int leaf=0; //求叶子节点数

int depth(TLNode Tree){ //深度

int s1,s2;

if(Tree==NULL)

return 0;

else{

s1=depth(Tree->lchild);

s2=depth(Tree->rchild);

if(s1==0 && s2==0) leaf++;

return (s1>s2?s1:s2)+1;

}

}


int Cnode(TLNode Tree){ //总结点

int s1,s2;

if(Tree==NULL)

return 0;

else{

s1=Cnode(Tree->lchild);

s2=Cnode(Tree->rchild);

return s1+s2+1;

}

}


void main(){

TLNode Tree;

printf("input 根节点: ");

create(&Tree);

printf("先序遍历:");

print1(Tree);

printf("中序遍历");

print2(Tree);

printf("后序遍历");

print3(Tree);

printf(" 深 度:%d ",depth(Tree));

printf("总结点数:%d ",Cnode(Tree));

printf("叶子结点数:%d ",leaf);

}

⑻ 十一、设计在链式存储结构上建立一棵二叉树的算法。

二叉树存储结构采用链式存储结构,对于满二叉树与完全二叉树可以按层序进行顺序4.3关系代数关系数据库系统的特点之一是它建立在数据理论的基础之上,有

热点内容
pod内部修改配置如何生效 发布:2024-10-08 20:25:33 浏览:234
重庆服务器托管市场低价云主机 发布:2024-10-08 20:23:39 浏览:361
运维接触源码 发布:2024-10-08 19:55:44 浏览:485
python怎么输出换行 发布:2024-10-08 19:42:19 浏览:416
dhcp服务器源码 发布:2024-10-08 19:42:07 浏览:737
Sql88 发布:2024-10-08 19:01:55 浏览:969
汽车参数配置怎么看干式离合 发布:2024-10-08 18:57:47 浏览:796
编译器设计图 发布:2024-10-08 18:53:36 浏览:189
x7买哪个配置的比较好 发布:2024-10-08 18:48:25 浏览:772
android局域网视频 发布:2024-10-08 18:35:29 浏览:694