![e26bf2ffa030d9ff3582dd7710dfd014.png](https://i-blog.csdnimg.cn/blog_migrate/2f487f3e29649f5a13d8b7c10da746b8.jpeg)
这篇文章来分享一个新算法——通过顺序表建立二叉树,此算法不复杂,想通很有意思喔~
It's show time!
Punchline-------------------------------------------------------------------
Task:用顺序表按层次存储完全二叉树的结点值,通过该顺序表存储结构建立完全二叉树。
Input:用户输入一行,空格隔开,整个输入以$结束。
Output:输出完全二叉树的广义表达式。
Realize:
- 创建完全二叉树(CreateTree):叨叨Chen用的递归算法,算法思路如下:
- 如果结点在顺序表中的位置loc>=len(顺序表的长度),则将该结点设置为NULL,并返回;
- if loc<len:说明上一个结点有孩子;
- loc如何定位?根据完全二叉树的特征可以知道,如果父结点序号为i,那么其左孩子为2*i,右孩子为2*i+1,但是注意你在C++中使用的下标,左右loc会进行调整,例如叨叨Chen这里使用的是0为起始,对于父结点0,其左孩子为1,右孩子为2,因此父结点为i,那么左孩子loc为2*i+1,右孩子loc为2*(i+1);
2.输出二叉树的广义表形式(print):结合程序理解会更好。
------------------------------------------------------------------------------
Let's get it!
//加载头文件;
#include
//定义完全二叉树结点结构体;typedef是为了兼容C语言;
typedef
//主要实现功能函数;
//创建完全二叉树
//main函数
int
读者可以观察到这里的main函数叨叨Chen没有用之前一些文章里的cin.getline()/cin.get()命令,相信读者也看到Input要求用户用空格隔开,那么我们为了避免将空格作为字符被传入数组,因此选取了cin。
以上叨叨Chen想和大家分享的用顺序表建立完全二叉树的算法,欢迎读者们提出批评和建议,叨叨Chen会采纳好的建议追加在文章后。下篇文章再见咯!
2020.10.08------------------------------------------------------------------It still comes---
叨叨Chen在复盘算法的时候,发现这篇算法中的一个地方可以小小改动一下。CreateTree(...)这个函数本来需要传递4个参数,这里可以改动一个地方使得main函数调用CreateTree的时候只需要传递3个参数。改动如下:
原来的CreateTree函数如下所示:
void
修改后:
void
main函数调用变为:
int
哈哈,修改完毕,读者可以发现叨叨Chen只是在原本的CreateTree函数的参数上作了小手脚,就是将形参int loc改为默认参数int loc=0(os:C++上的小小知识点)。这样去除冗余参数,读者在读main函数的时候,更能明白各个参数代表的含义。
叨叨Chen今天就写在这里啦,之后复盘算法有新收获的话,还会更新的喔~
2020.10.11-----------------------------------------------------------------It still comes---