今天我们来讲一下二叉树的概念和例题
要知道什么是二叉树,就先要知道什么是树:
我们来看一下树的详细定义:
树是一种数据结构,它是由n(n≥0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:
每个节点有零个或多个子节点;没有父节点的节点称为根节点;每一个非根节点有且只有一个父节点。
可能这不是很好理解,我们可以来看一个例子:
我们来可以下这个树,就可以分析一下上面的那几句话了,首先,上图是一个集合
我们把它标上号,这棵树就如下图:
我们称{B,C}是A的儿子节点,{D,E,F}是B的儿子节点,那么:
我们称A是{B,C}的父节点,B是{D,E,F}的父节点。
然而,我们做出一个表出来,来方便观察每个节点的父节点:
然后呢,你会发现,A没有父节点,所以我们称A为整棵树的根节点。
所以呢,到此为止,我们在上面那句话就解释完毕了。
我们来讲一下树的”度“的这个概念,其实树的度就是一个节点的儿子个数。
那么,言归正传,其实,二叉树就是每个节点的”度“最高为2的树,我们称它为”二叉树“。
我们现在来了解一下二叉树的4个性质:
二叉树的四个性质(重点):
第一个性质:
在非空二叉树中,第i层的总节点数不超过,
这个还是比较好证明:就当第i层都是慢的节点,
i=1,总节点数是1
i=2,总节点数是2
i=3,总节点数是4
以此类推所以我们得出:在非空二叉树中,第i层的总节点数不超过,
第二个性质:
深度为h的二叉树最多有个节点,最少有h个节点。
最少的很容易想到,在这里不与证明,最大就有一点难,需要一些数学基础
到深度为h,其实就是,公比为2
所以就是:,带入:
也就是,我们知道,所以:
深度为h的二叉树最多有个节点,最少有h个节点。
第三个性质:
对于任意一棵二叉树,如果其叶节点数为a,读书为2的节点数为b,那么a=b+1
第四个性质:
具有n个节点的完全二叉树的深度为,此性质跟第一个类似,在此不再介绍
我劝你们去休息一下,马上又是重点(看没看到下面的东西在上面的基础上还加了个“难字”)
二叉树的遍历(重难点):
我在这里画一棵二叉树:
我们先来了解一下先序遍历,他的方法是根、左、右,所以先序遍历是:ABDCEGFH
我们再来了解一下中序遍历,他的方法是左、根、右,所以中序遍历是:DBAGECFH
我们再来了解一下后序遍历,他的方法是左、右、根,所以后序遍历是:CBGEHFCA
讲的不是很详细,希望谅解一下,建议去看一下这个视频:三分钟教会你遍历二叉树!
时间很短啊,也十分详细,这里上一下二叉树前、中、后序的遍历函数
先序、中序、后序遍历的代码:
void qian(int x){if(x>0){cout<<tree[x].data<<" ";qian(tree[x].left);qian(tree[x].right);}}void zhong(int x){if(x>0){zhong(tree[x].left);cout<<tree[x].data<<" ";zhong(tree[x].right);}}void hou(int x){if(x>0){hou(tree[x].left);hou(tree[x].right);cout<<tree[x].data<<" ";}}
也就这样,自己看吧……
接下来,是二叉树的经典例题,可以参考一下我的这篇博文:找树根和孩子
写的也是十分详细,好了,今天就到此为止吧!