![5f002978b70a97a382ce9b845b5df061.png](https://img-blog.csdnimg.cn/img_convert/5f002978b70a97a382ce9b845b5df061.png)
SHUO ZAI QIAN MIAN
说 在 前 面
这里是中国传媒大学,19广电工2班的公众号,一切内容仅供班级成员及感兴趣的同学学习参考,请勿用作其他用途。作者也是在校学生,水平有限,内容难免有所缺漏,请大家不吝赐教!
btw. 受手机屏幕及公众号格式限制,代码看起来可能有点费劲,可以点击下方“阅读原文”获取CSDN博客链接,在电脑上打开。
![5f002978b70a97a382ce9b845b5df061.png](https://img-blog.csdnimg.cn/img_convert/5f002978b70a97a382ce9b845b5df061.png)
二叉树
这篇博客主要针对代码实现,有关树和二叉树的基本概念书上讲的贼清楚,我觉得我再讲一遍也不会讲的比书上好了,所以大家如果基本概念有问题,直接看书吧 ^ ç ^
二叉树的存储结构
二叉树的存储结构有顺序存储结构和链式存储结构两种,其中顺序存储结构的操作相对简单,但在二叉树较空的情况下空间利用率很低,所以在实际应用中,链式存储结构的应用更广泛。
链式存储结构
二叉树的链式存储结构中,每个节点都包含如下成分:
struct BTNode{
//"二叉树点"
ElemType data; //用define把char定义为ElemType
BTNode *lc,*rc; //lc是"left child"左孩子,rc是"right child"右孩子
};
用data
存储数据,lc
和rc
分别指向左、右节点,相当于每个节点都有两个指针域的链表
二叉树的算法设计
在下面的代码中,部分代码用到STL
中的栈stack
和队列queue
,头文件分别为和
。
STL
中的栈和队列采用类的成员函数的形式调用,这很方便地提供了一种可用的栈和队列的结构。
对栈和队列还不太熟悉的可以看一下之前的文章:
数据结构与算法——栈
数据结构与算法——队列
里面提到了栈和队列的基本思想,以及STL
库的简单用法。
用字符串建立二叉树
二叉树有一种表示法为括号表示法,本算法的功能是读取一段括号表示法的二叉树,把它转化为链式存储结构的二叉树。
要成功设计本算法,就要先弄懂什么是括号表示法
什么是括号表示法?
括号表示法:将树的根结点写在括号的左边,除根结点外的其余节点写在括号中,并用逗号分隔
在二叉树中,除叶子结点外,每个节点都有两个子结点——左孩子和右孩子,所以“括号”的形式被固定下来了:父结点(左孩子,右孩子)
,比如:
A(B,C)
是指这样的一个二叉树:简单的二叉树 A(B, )
则是这样的:没有C的更简单二叉树
我们推广“左孩子”和“右孩子”的定义——不光是结点,我们把子树也看作孩子,那么:
对于
A(B,C(D,E))
,A
的左孩子是B
,右孩子是一颗子树C(D,E)
,这棵子树是这样的:子树C