寒假算法学习(二叉树)

概念:

二叉树的概念:二叉树(Binary Tree)是一种树形数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。这种结构类似于自然界中的树,其中每个节点可以有零个、一个或两个子节点。

基本特点:

二叉树的基本特点包括:

  1. 根节点(Root): 树的顶部节点,没有父节点。
  2. 父节点(Parent): 每个非根节点都有一个父节点,它是其直接连接的上层节点。
  3. 子节点(Child): 节点的直接下层节点,可以有零个、一个或两个子节点。
  4. 叶子节点(Leaf): 没有子节点的节点,即没有左子节点和右子节点的节点。
  5. 深度(Depth): 从根节点到某个节点的唯一路径的长度。
  6. 高度(Height): 从某个节点到其深度最大的叶子节点的路径长度。

种类:

二叉树的种类包括:

  1. 满二叉树(Full Binary Tree): 除了叶子节点,每个节点都有两个子节点。
  2. 完全二叉树(Complete Binary Tree): 除了最后一层,其他层都被填满,最后一层从左到右填充,缺少的位置只能在最右边留空。

能够解决哪些问题?(不完全)

二叉树作为一种灵活的数据结构,在计算机科学和算法设计中有许多应用。以下是二叉树能够解决的一些常见问题:

  1. 搜索和查找: 二叉搜索树(BST)是一种特殊类型的二叉树,它保持左子树节点的值小于父节点的值,右子树节点的值大于父节点的值。这使得在BST中进行搜索和查找操作的时间复杂度为O(log n),其中n是树中节点的数量。

  2. 排序: 通过对二叉搜索树进行中序遍历,可以得到有序的节点序列,实现对数据的排序。

  3. 图的表示: 二叉树可以用来表示无向图,其中每个节点代表图中的一个顶点,每个节点的左右子节点表示与该顶点相邻的顶点。

  4. 表达式树: 二叉树可以用来表示数学表达式,其中叶子节点是操作数,而内部节点是运算符。通过遍历表达式树,可以求解数学表达式的值。

  5. 文件系统和目录结构: 文件系统中的目录结构通常可以表示为树形结构,其中每个目录是树中的节点,子目录是父目录的子节点。

例题:

P1305 新二叉树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目描述

输入一串二叉树,输出其前序遍历。

输入格式

第一行为二叉树的节点数 n。(1≤n≤26)

后面 $n$ 行,每一个字母为节点,后两个字母分别为其左右儿子。特别地,数据保证第一行读入的节点必为根节点。

空节点用 '*' 表示

输出格式

二叉树的前序遍历。

样例输入
6
abc
bdi
cj*
d**
i**
j**

样例输出
abdicj
 

思路:

利用结构体存节点和孩子,将表示节点的字母node作为数组tree下标,左孩子存入结构体中的left,右孩子存入结构体中的right,采用一边输入一边存储的方式完成输入,最后输出(要求输出该二叉树的先序遍历)时,所以先输出node。

代码:

#include<bits/stdc++.h>
using namespace std;

struct tree {		//定义结构体来存树的节点
	char left;		//left代表左孩子
	char right;		//right代表右孩子
}tree[110];

void pre(char node){

	cout<<node;		//要求输出先序遍历,所以先输出节点
	if(tree[node].left!='*')	//当存孩子的节点不为空时,递归
		pre(tree[node].left);
	if(tree[node].right!='*')
		pre(tree[node].right);
}
int main(){
	int n;
	char x,l,r,sx;
	scanf("%d",&n);
	cin>>sx>>l>>r;		//第一个节点为根节点,所以先输入
	tree[sx].left=l;
	tree[sx].right=r;
	for(int i=1;i<n;i++){
		cin>>x>>l>>r;	//输入其他节点
		tree[x].left=l;
		tree[x].right=r;
	}
	pre(sx);
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值