学习反思: 二叉树是非常非常非常重要的,因为所有的树都能转化成一棵二叉树,并且树的问题也很容易出。
oj上面的树基本都是二叉树的题目,难死我了,死活做不出来一两个的难。
难点主要在于递归,因为我的递归一直不是很好,而且对他存在一定的畏惧心理,所以一直都不是很擅长,一直都在回避,不过这次我不会再回避啦。已经做了两个题目了!!继续加油!剩下的基本上很少是像第二题那样的规律题了,嗯嗯,努力看看书就会的内容,争取打代码的时候可以不用看书的说啦~。
加上最近我不知道怎么回事(可能是做不出来题目习惯了,都难以思考了),哎,强迫思考ing。
其实有的题目写出来了之和(问的别人)就会发现其实并不是那么难,但是自己思考的时候不知道为什么就是做不出来哇,果然是自己脑子瓦特了;
二叉树不难,二叉树不难,好好学肯定可以学的很好的!(持续催眠ing)
基本内容 定义:
二叉树是n(n≥0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。
二叉树的特点
- 每个结点最多有两棵子树;
- 二叉树是有序的,其次序不能任意颠倒。
斜树
- 所有结点都只有左子树的二叉树称为左斜树;
- 所有结点都只有右子树的二叉树称为右斜树;
- 左斜树和右斜树统称为斜树。
- 在斜树中,每一层只有一个结点;
- 斜树的结点个数与其深度相同。
若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树。
特点:
- 叶子结点只能出现在最下两层,且最下层的叶子结点都集中在二叉树的左部;
- 完全二叉树中如果有度为1的结点,只可能有一个,且该结点只有左孩子。
- 深度为k的完全二叉树在k-1层上一定是满二叉树。
除了叶子结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树。
只有度为0或者为2的节点。
满二叉树在同样深度的二叉树中结点个数最多。
满二叉树在同样深度的二叉树中叶子结点个数最多。
平衡二叉树
它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
二叉树的性质: (1) 在非空二叉树中,第i层的结点总数不超过2的i-1次方 , i>=1;
(2) 深度为h的二叉树最多有2的h次方减1个结点(h>=1),最少有h个结点;
(3) 对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为N2,则N0=N2+1;
(4) 具有n个结点的完全二叉树的深度为[2为底n的对数]+1 (注:[ ]表示向下取整)
(5)有N个结点的完全二叉树各结点如果用顺序方式存储,则结点之间有如下关系:
- 若I为结点编号则 如果I>1,则其父结点的编号为I/2;
- 如果2*I<=N,则其左孩子(即左子树的根结点)的编号为2*I;若2*I>N,则无左孩子;
- 如果2*I+1<=N,则其右孩子的结点编号为2*I+1;若2*I+1>N,则无右孩子。
h(N)为卡特兰数的第N项。h(n)=C(2*n,n)/(n+1)。
(7)设有i个枝点,I为所有枝点的道路长度总和,J为叶的道路长度总和J=I+2i
二叉树的遍历方式 先序遍历
先访问根节点,先序遍历左子树,先序遍历右子树
中序遍历
中序遍历左子树,访问根节点,中序遍历右子树
后序遍历
后序遍历左子树,后序遍历右子树,访问根节点
层次遍历
即按照层次访问,通常用队列来做。访问根,访问子女,再访问子女的子女
想要完全确定一棵二叉树,必须至少知道两种遍历方式,并且遍历方式局限为:知道前中推后,知道后中推前。
oj上面有练习题,对于不知道substr的我来说有点难,知道了就好多了。
推荐阅读
- 笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历
- C语言学习(bit)|16.C语言进阶——深度剖析数据在内存中的存储
- 数据结构和算法|LeetCode 的正确使用方式
- 先序遍历 中序遍历 后序遍历 层序遍历
- 数据结构|C++技巧(用class类实现链表)
- 数据结构|贪吃蛇代码--c语言版 visual c++6.0打开
- 算法|算法-二分查找
- 数据结构学习指导|数据结构初阶(线性表)
- leetcode题解|leetcode#106. 从中序与后序遍历序列构造二叉树
- java|ObjectOrientedProgramming - 面向对象的编程(多态、抽象类、接口)- Java - 细节狂魔