从0开始的(c语言)数据结构学习 5:二叉树

理解:什么是树

树树:一堆结点有限集

对于非空树,满足两个条件:

  1. 有且有一个称为“”的结点(比如图中的A)
  2. 除根之外有其他结点,可分为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,函数_搜索树深度

本函数我根本不想写了,请根据遍历树的方式,尝试自己找到树的深度吧!

咳咳

如果你是初学者:

本次内容非常少,而且简单,到令人发指……主要的原因是,树和二叉树的基础确实没有什么可以讲的。

比起这个,我建议各位去力扣或者洛谷刷刷二叉树的题,会更有利于你理解树和树的搜索。

如果你想要没有注释的代码:

自己写,请。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值