树是一种非线性结构

1. 树的定义

树是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合。

2. 而我们这一章学习的主要是二叉树,二叉树有以下基本性质:

性质1:二叉树第i层上的结点数目最多为 2{i-1} (i≥1)。
性质2:深度为k的二叉树至多有2{k}-1个结点(k≥1)。
性质3:包含n个结点的二叉树的高度至少为log2 (n+1)。
性质4:在任意一棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则n0=n2+1。

3. 二叉树的遍历

1.先(根)序遍历的递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴ 访问根结点;
⑵ 遍历左子树;
⑶ 遍历右子树。
2.中(根)序遍历的递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴遍历左子树;
⑵访问根结点;
⑶遍历右子树。
3.后(根)序遍历得递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴遍历左子树;
⑵遍历右子树;
⑶访问根结点。
 层序遍历
除了先序遍历、中序遍历、后序遍历外,还可以对二叉树进行层序遍历。设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。
然后是我对于编程题深入虎穴的分享。
一开始的错误代码忘了保存,只记得算法大部分地方和同学的是基本一致的,但是find函数好像出了问题,在当时就是可以输入数据,但是程序会直接卡死(开发环境里)。
后来改了下find函数,然后成功通过了。
#include<iostream>
#include<queue>
using namespace std;

typedef struct {
	int doors;//门的数量
	int *p;//p指向具体们的编号,把p看作一个整型数组
}node;

int input(node*&a) {
	int n, i;
	bool *vi = NULL;//定义布尔数组
	cin >> n;
	a = new node[n+1];//创建a结构体数组
	vi = new bool[n + 1];//定义一个布尔类型的数组
	for (int i = 1; i <= n; i++) {//将vi数组初始化为false
		vi[i] = false;
	}

	for (int i = 1; i <= n; i++) {
		cin >> a[i].doors;
		a[i].p = new int[a[i].doors];//为数组申请空间
		for (int j = 0; j <a[i].doors;j++) {
			cin >> a[i].p[j];
			vi[a[i].p[j]] = true;//若门存在,则置为1
		}
	}
	//找出根在i数组的下标
	for (i = 1; i <= n; i++) {
		if (!vi[i]) break;
	}
	return i;
}

int find(node*a, int root) {
	//从a数组的下标往下搜索
	queue<int> q;//定义用于存放带访问的门编号和队列
	int x, i;
	//根编号入队
	q.push(root);
	//当队列不为空,出队一个元素
	//x后面的门的号码入队
	while (!q.empty()) {
		x = q.front();//取队头元素
		q.pop();//队头元素出队
		for (i = 0; i < a[x].doors; i++) {
			q.push(a[x].p[i]);
		}
	}
	return x;
}

int main()
{
	//变量的定义
	node*a;//定义一个动态的整型数组
	int root;//定义辅助变量以及root
	root = input(a);
	cout << find(a, root) << endl;//输出答案
	return 0;
}

 这样的话程序就可以通过了,上次我忘了定目标,但我觉得对第四章内容还不够熟悉,所以我这一次的目标是复习好第四和第五章,能够更加熟练的运用数组和树解决问题。加油!

 
posted on 2019-05-04 21:49  瓦砾之空  阅读(131)  评论(1编辑  收藏  举报