【数据结构】二叉树的存储方式:数组和二叉链表

其他人都复工了

我还在家远程办公中......

——————————下面是正文——————————

一.存储

       1.1.完全二叉树的存储

        完全二叉树与其他二叉树不一样的地方是规定每一层的节点都填满了才能去下一层新增节点,而且新增的节点一定要从左到右的顺序新增,如果你是从右到左的顺序新增,那就不是完全二叉树,如以下图即为一个经典的完全二叉树:    

             

       那么使用什么存储方法可以更好地对完全二叉树进行遍历查找呢?答案是数组。将结点编号当做数组下标进行存储,可通过计算快速得出想要的结点的左右结点、父结点什么的,下面给出一个简易版的使用数组进行存储的代码:

	int temp = 0;
	int left, right, father = 0;
	char Binary_Tree[9] = { 'A','B','C','D','E','F','G','H','I' };
	printf("请输入想要查询其结点的根结点:");
	scanf("%d", &temp);
	left = 2 * temp; if (left >= 10) left = NULL;
	right = 2 * temp + 1; if (right >= 10) right = NULL;
	father = temp / 2; if (father >= 10||father <=0) father = NULL;

	printf("左结点为:%d,其值为:%c,右结点为:%d,其值为:%c,其父结点为:%d,其值为:%c\n",left,Binary_Tree[left-1],right,Binary_Tree[right-1],father,Binary_Tree[father-1]);
	system("pause");

       当然,在选择一些特殊结点,如“7”结点这种没有左右结点的需要设置一些特殊提醒基础,但上面的代码里没有给出。在代码里有个关键的地方是左右结点以及夫结点的计算,这个计算就不详细解释,来观察下编译的结果:

                  

        1.2.一般二叉树的存储

        和完全二叉树不同的是,一般二叉树没有那么“娇贵”,每个结点都可有可无结点,如以下二叉树:

                   

         对于这种一般二叉树也是可以用数组来进行数据存储的,但需要将没有的结点进行补齐

                    

         如此,在没有结点的地方手动将其补上,既可以和完全二叉树一样用数组进行存储,但是有个问题是当缺失的结点数量比较多时,数组存在很多空缺,会在一定程度上造成资源空间浪费。所以,更好的办法是使用链表的方法对一般二叉树进行一个存储,链表中设置两个指针分别指向其左右结点:

                                                              

       创建一个二叉链表的代码网上有很多,在此献上按照本人想法瞎搞的一份代码,代码是通过先序遍历的方法对数据进行存储,先序遍历是二叉树的一种遍历方式,可表现为:

                                                         第一步:访问其父结点

                                                         第二步:访问其左结点

                                                         第三步:访问其右结点

        根据线序遍历的方法,逐个逐个对数据进行输入,但需要注意的是输入的数据是根据先序遍历的方法进行存储的:

Node* createTree()
{
	int temp;
	printf("请输入第%d个节点:",++i);
	scanf("%d", &temp);
	Node *n = NULL;

	if (temp == 0) return NULL;
	else
	{
		n = (Node*)malloc(sizeof(Node));
		n->data = temp;
		n->left = createTree();
		n->right = createTree();
	}

	return n;
}

         如有图下这样一幅二叉树:

                                                               

         则通过以下输入即可得到以上的二叉树:

                                                                    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

师兄师兄怎么办

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值