什么是二叉树?
二叉树是数据结构中最基础也最重要的结构之一,就像盖房子先打地基一样,理解二叉树能帮你后续轻松掌握更复杂的结构(比如堆、红黑树等)。
想象一下,二叉树长得像一棵“分叉树”——每一个“分叉点”都是一个“节点”,每个节点最多能分出两个“子节点”,左边的叫“左子节点”,右边的叫“右子节点”。没有子节点的节点叫“叶子节点”(就像树的叶子一样)。
举个简单的例子:你家院子里有一棵苹果树,每个苹果可以看作一个“节点”,连接苹果和树干的树枝就是“边”。如果树干是“根节点”,它可能分出两根树枝(左枝和右枝),每根树枝上又可能有多个苹果(子节点),但每根树枝最多只能有两个苹果(因为二叉树每个节点最多两个子节点)。
二叉树的“零件清单”:基本术语¶
要画二叉树,得先认识它的“零件”:
- 节点:树的基本单元,里面可以放数据(比如数字、字符串等)。
- 根节点:树的“最顶层”节点,没有父节点,是树的起点。
- 叶子节点:没有子节点的节点,是树的“最底层”。
- 子节点:从某个节点“长”出来的下一层节点(左子节点或右子节点)。
- 父节点:有子节点的节点(比如“根节点”是“左子节点”的父节点)。
- 左子树/右子树:一个节点的左子节点和它的所有后代组成“左子树”,右子节点和它的所有后代组成“右子树”。
手把手画二叉树:从简单到复杂¶
现在,我们用“画图法”一步步掌握二叉树的画法,跟着步骤画,你会发现超简单!
第一步:最简单的二叉树——只有根节点¶
先画一个“圆圈”代表根节点,里面写个数字(比如1)。这棵树只有根节点,没有子节点,所以它也是叶子节点。
1
第二步:根节点只有左子节点¶
在根节点的正下方偏左画一个小圆圈(左子节点),里面写数字(比如2)。根节点的右边暂时不画(表示没有右子节点)。
1
/
2
第三步:根节点只有右子节点¶
在根节点的正下方偏右画一个小圆圈(右子节点),里面写数字(比如2)。左边不画。
1
\
2
第四步:根节点有左右两个子节点¶
根节点下面偏左画左子节点(比如2),偏右画右子节点(比如3)。
1
/ \
2 3
第五步:给左子节点再“长”出子节点¶
以第二步的树为例,左子节点2可以继续长左子节点(4)和右子节点(5)。此时树的结构是:
1
/ \
2 3
/ \
4 5
这里要注意:每个节点最多只能有两个子节点,不能多画。比如如果2下面画了三个子节点,那就不是二叉树了!
第六步:给右子节点也“长”出子节点¶
继续在第四步的基础上,给右子节点3加左子节点6和右子节点7:
1
/ \
2 3
/ \ / \
4 5 6 7
第七步:判断“不是二叉树”的错误画法¶
错误例子1:某个节点有三个子节点(比如根节点1下面画三个分支):
1
/|\
2 3 4 // 这不是二叉树!
错误例子2:子节点位置混乱(比如左子节点的右子节点比根节点的右子节点还高)——画图时尽量保持层次,根节点在最上,子节点在根的下一层,孙子节点在子节点的下一层,以此类推。
二叉树的“身份验证”:怎么判断是二叉树?¶
只要满足两个条件,就是二叉树:
- 每个节点最多有0、1或2个子节点(不能超过2个);
- 所有子节点的位置是有序的(左子节点和右子节点有明确区分,不能交换顺序而改变树的结构)。
二叉树遍历与画图结合(简单版)¶
知道了怎么画树,那怎么通过“遍历结果”反推树的结构呢?这里先简单介绍三种遍历方式(后续会深入):
- 前序遍历(根→左→右):先画根节点,再画左子树,最后画右子树。
- 中序遍历(左→根→右):先画左子树,再画根节点,最后画右子树。
- 后序遍历(左→右→根):先画左子树,再画右子树,最后画根节点。
举例:假设前序遍历结果是 1 2 4 5 3 6 7,怎么画出树?
- 前序第一个是根节点1,所以先画1。
- 前序剩下的是左子树(2 4 5)和右子树(3 6 7)。
- 左子树的第一个是2,所以2是1的左子节点。
- 2的前序剩下4、5,4是2的左子节点,5是2的右子节点。
- 右子树的第一个是3,所以3是1的右子节点。
- 3的前序剩下6、7,6是3的左子节点,7是3的右子节点。
最终画出的树和之前第四步加第五步的例子一致:
1
/ \
2 3
/ \ / \
4 5 6 7
总结:画树是理解二叉树的“金钥匙”¶
二叉树的“画”是学习的核心——通过画图,你能直观看到每个节点的位置、子节点的数量和层次关系。刚开始可能觉得难,多画几次简单的树(比如只有根、只有左/右孩子、三层树),很快就能掌握。
记住:二叉树是堆、二叉搜索树、哈夫曼树等复杂结构的“地基”,画树的过程不仅能帮你理解基础,还能为后续学习算法(比如排序、查找)打下坚实基础。
现在,你可以找一张纸,尝试画一棵包含根、左右孩子、孙子节点的二叉树,动手画一两个例子,你会发现:二叉树,原来这么简单!