理解:什么是树
树:一堆结点的有限集。
对于非空树,满足两个条件:
- 有且有一个称为“根”的结点(比如图中的A)
- 除根之外有其他结点,可分为m个互不相交的有限集。其中每一个有限集本身也可以是树,称为根的子树。
关于树的一些术语:
结点:树的每一个独立单元
度:通常指结点的度,表示结点拥有的子树数量。比如A的度是3,B的度是2。
叶子:度为0的结点,也就是最末端。
层次:结点的层次从根开始,根是第1层,每往下走一格,都+1层。
深度:从根到路程最长的叶子处,称为树的深度。
有序树和无序树:树种的各子树从左到右看是有次序的,便是有序树。(通常来说,有序树的左右不能随意改变。有序树的最左边是第一个结点,最右边是最后一个结点)否则就是无序树。
森林:多个树的集合。
理解:什么是二叉树
简单来说就是子树最多为2的树。我们通常称左边的结点为左结点(左子树),右边的为右结点(右子树)。
1,结构:
typedef struct BiNode
{
char data;//数据域
struct father *lechild,*richild;//分别存储父节点,左子树,右子树
}BiTNode,*BiTree;
与其他不太相同的是,二叉树“通向”了三个方向,父节点,左子树,右子树。
2,函数_先序创建二叉树
void CreateBiTree(BiTree &T)//先序遍历创建二叉树
{
char ch;
cin >> ch;
if(ch=="填入你设定为“空”的字符,比如‘#’") T=NULL;
else{
T=new BiTNode;//创建新的结点用于储存我们输入的数据
T->data=ch;//先序:先做,然后左,然后右
CreateBiTree(T->lechild);
CreateBiTree(T->richild);
}
}
这里用到了递归……至于这个递归是什么意思,我觉得可以用一个流程来表达:
先序:首先填充当前结点,然后向左走,如果左边没路,向右走,如果右边也没路,就回到上一个结点。
类似的,我们可以得到中序、后序遍历的建树方式。
中序遍历:
CreateBiTree(T->lechild);
T->data=ch;
CreateBiTree(T->richild);
后序遍历:
CreateBiTree(T->lechild);
CreateBiTree(T->richild);
T->data=ch;
至于这两个玩意是怎么个原理,你们也可以试着画图去试试看。
3,函数_先序遍历树
void InOrderTraverse(BiTree T){
if(T){
cout << T->data;
InOrderTraverse(T->lechild);
InOrderTraverse(T->richild);
}
}
判断当前结点不为空。if(T)
然后按上面的格式……递归起来。类似于中序和后序创建树的方法,我们也可以用中序遍历和后序遍历树。
4,函数_搜索树深度
本函数我根本不想写了,请根据遍历树的方式,尝试自己找到树的深度吧!
咳咳
如果你是初学者:
本次内容非常少,而且简单,到令人发指……主要的原因是,树和二叉树的基础确实没有什么可以讲的。
比起这个,我建议各位去力扣或者洛谷刷刷二叉树的题,会更有利于你理解树和树的搜索。
如果你想要没有注释的代码:
自己写,请。