树
树是一种非线性结构
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.后(根)序遍历得递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴遍历左子树;
⑵遍历右子树;
⑶访问根结点。
4 . 层序遍历
除了先序遍历、中序遍历、后序遍历外,还可以对二叉树进行层序遍历。设二叉树的根节点所在层数为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; }
这样的话程序就可以通过了,上次我忘了定目标,但我觉得对第四章内容还不够熟悉,所以我这一次的目标是复习好第四和第五章,能够更加熟练的运用数组和树解决问题。加油!