将二叉树保存到动态指针数组中

发布时间:2024年01月05日

把二叉树的结点按从上到下、从左到右依次编号为0、1、2、3......(空指针也要占一个编号)。

则如果某个结点的编号是i,根据二叉树的性质有:

它的左孩子的编号是2*i+1;

它的右孩子的编号是2*i+2;

可以据此把二叉树保存到一个数组中,这里是保存到了一个动态指针数组中。

下面是代码部分:

//这个是测试用数据,输入-1表示孩子为空指针
//69 25 74 -1 -1 83 -1 -1 10 88 -1 -1 115 -1 -1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct BtNode
{
	int data;
	struct BtNode *left,*right;
};

typedef struct BtNode **PtPt;

void createbt(PtPt *ptarr,int root,int *plen)
{
	int data,newlen;
	
	if(root>=*plen)
	{
		newlen=(*plen)*2;
		*ptarr=(PtPt)realloc(*ptarr,newlen*sizeof(struct BtNode*));
		memset(*ptarr+(*plen),0,(newlen-*plen)*sizeof(struct BtNode*));
		*plen=newlen;
	}
	scanf("%d",&data);
	if(data==-1)
	{
		return;
	}
	(*ptarr)[root]=(struct BtNode*)malloc(sizeof(struct BtNode));
	(*ptarr)[root]->data=data;
	createbt(ptarr,2*root+1,plen);
	createbt(ptarr,2*root+2,plen);
}

void preorder(PtPt arr,int root,int len)
{
	if(root<len && arr[root])
	{
		printf("%d ",arr[root]->data);
		preorder(arr,2*root+1,len);
		preorder(arr,2*root+2,len);
	}
}

void midorder(PtPt arr,int root,int len)
{
	if(root<len && arr[root])
	{
		midorder(arr,2*root+1,len);
		printf("%d ",arr[root]->data);
		midorder(arr,2*root+2,len);
	}
}

void postorder(PtPt arr,int root,int len)
{
	if(root<len && arr[root])
	{
		postorder(arr,2*root+1,len);
		postorder(arr,2*root+2,len);
		printf("%d ",arr[root]->data);
	}
}

int countdeep(PtPt arr,int root,int len)
{
	int leftdeep,rightdeep;
	
	if(root<len && arr[root])
	{
		leftdeep=countdeep(arr,2*root+1,len);
		rightdeep=countdeep(arr,2*root+2,len);
		return 1+(leftdeep>rightdeep?leftdeep:rightdeep);
	}
	return 0;
}

void cengorder(PtPt arr,int len)
{
	int i;
	
	for(i=0;i<len;i++)
	{
		if(arr[i])
		{
			printf("%d ",arr[i]->data);
		}
	}
}

void freebt(PtPt arr,int len)
{
	for(len--;len>0;len--)
	{
		if(arr[len])
		{
			free(arr[len]);
		}
	}
	free(arr);
}

int main()
{
	int root=0,len=1;
	PtPt arr=(PtPt)calloc(len,sizeof(struct BtNode*));
	
	memset(arr,0,len*sizeof(struct BtNode*));
	
	printf("请输入二叉树的各结点的值(空指针输入-1):");
	createbt(&arr,root,&len);
	
	printf("先序遍历:");
	preorder(arr,root,len);
	printf("\n");
	
	printf("中序遍历:");
	midorder(arr,root,len);
	printf("\n");
		
	printf("后序遍历:");
	postorder(arr,root,len);
	printf("\n");
	
	printf("按层遍历:");
	cengorder(arr,len);
	printf("\n");
	
	printf("树的深度是:%d\n",countdeep(arr,root,len));
	
	freebt(arr,len);
	
	return 0;
}

结果显示:

文章来源:https://blog.csdn.net/m0_70617415/article/details/135373117
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。