二叉树,光有看名字就知道每个节点可以有两个分支:
就同这棵树的节点。
为什么要学习二叉树,因为它相较于C语言中的冒泡和二分查找,二叉树简直完爆它们,主打一个效率高。
接下来,介绍几个在二叉树中常见的名称:
1.节点的度:一个节点含有的子树的个数称为该节点的度
2.叶节点或终端节点:度为0的节点称为叶节点
3. 非终端节点或分支节点:度不为0的节点
4. 双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点
5. 孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点
6. 兄弟节点:具有相同父节点的节点互称为兄弟节点(亲兄弟)
7. 树的度:一棵树中,最大的节点的度称为树的度
8. 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推
9.树的高度或深度:树中节点的最大层次
10. 堂兄弟节点:双亲在同一层的节点互为堂兄弟
11. 节点的祖先:从根到该节点所经分支上的所有节点
12. 子孙:以某节点为根的子树中任一节点都称为该节点的子孙
13. 森林:由m(m>0)棵互不相交的树的集合称为森林
以上加粗就是需要进行深入理解的。
二叉树中又分为满二叉树和完全二叉树,满二叉树就是每一层节点个数都是满的,比如第一层就是
2的零次方个节点第二层就是2的1次方节点就是2个节点即为满二叉树,完全二叉树通俗说就是除了最后一层以外,每个节点都要都要是满的,并且最后一层分支要靠左连续就是比如:
这些树都不是连续靠左的,正确应该是:
这是二叉树所具有的一些性质,第三点是需要记忆的。
在二叉树的学习中,我们会学习到堆,,引出大堆和小堆,大堆就是在顶部是整个树上值最大的元素,小堆就是值最小,我们要建一个堆其实很简单,就是malloc出一个数组然后利用二叉树的节点特性建堆,在二叉树中又父节点和子节点,它们两者之间的关系是father*2+1或者+2,为子节点,子节点-1整体除以2就是父节点的下标位置;经过正常开出数组后这个数组里面不是二叉树满足的顺序关系,于是要按照父节点与子节点的关系进行向下调整或者向上调整,代码如下:
先给出头文件
再给出向上向下调整
接下来就是开出数组空间的常规操作:
在二叉树的学习中,分治递归是常用的方法,有时题目还需结合栈和队列进行完成;在C语言的学习中我们学习过递归,递归核心思路是把大问题拆分为一个个小问题进行解决或者是说拆分为当前问题和子问题,返回条件是最小规模的子问题,在这方面学习时前期需按照递归一样画出递归展开图,一步一步走读代码。
在二叉树中存在前序遍历、中序遍历和后续遍历,还有一个与队列结合的层序遍历,我们先来学习前三个,三者代码几乎一模一样就是放置顺序不同
代码如下:
这是三者访问顺序不同之处
拿上面举例,二叉树应该这么看:
空白处用N表示。一棵树可以被拆分为左子树和右子树:
根
根 (左子树) 根(右子树)
左子树 右子树 左子树 右子树
正因为可以这样一直拆的特性,二叉树的题目离不开递归
接着就给出二叉树与队列的综合题:判断完全二叉树
这里的实现需先制造队列
代码:
层序遍历:
有些题目会给你三个遍历中的两个让你推第三个,这里需要观察它们的特性,前序第一个元素就是总根,后序最后以为就是总根,然后根据根的位置在中序中找出左子树和右子树,然后在根据两者去画图判断。
初学二叉树一定要画图解决问题。感谢观看!