结构体的定义:
结构体初始化实现的几种方式:
这种不够保险:有时候需要有node(){}这行,不然会过不了编译:参见洛谷5076:
建议使用这种
二选一后,生成结构体时就可以直接初始化了:
(但要注意,此时用不了:
)
否则只能选择如下方式的初始化:
这种方式传入参数的顺序不一定按a,b,c的顺序,不够安全233
二叉树的一些用法:
洛谷4715,代码来自题解:
注意:完美二叉树结点数量与2的层数次方的关系(可以灵活运用1<<n来限制范围)
技巧:本题题解用了两个数组,一个记录获胜节点的序号,另一个记录获胜结点的数值;
可将需要比较的子节点置于树的最下层(这点可通过利用1<<n控制下标来实现),再按比较的整个过程来填充这棵树,从而获得排名
建立一棵二叉树,下面的代码不需要提前知道有多少组建树数据,且结点序号不一定从大到小,但要求空结点用0来表示:
求树的深度:
附上洛谷题解的更优代码:
二叉树的遍历1:
1、若已知前序遍历和中序遍历 或中序遍历和后序遍历,则能推出剩下的一种(写函数时有for循环也许比while循环更方便,也能避免一些不必要的错误,注意考虑)
2、若已知前序遍历和后序遍历时存在不同的中序遍历,则一定有结点仅有一个子节点
3、若已知前序遍历和中序遍历 或中序遍历和后序遍历,则能构造这棵二叉树:
可以用两个数组分别记录左右节点,再配合深搜(一般是往两边继续搜,然后将需要的值保存下来或传到下一轮)即可实现大部分想要的操作
经典的引用传值例子,代码来自紫书:
二叉树的遍历2:(代码来源于紫书)
思路:结构体+指针:
1、new的使用:
new操作创造了一个node(),然后该函数会返回这个node的指针
2、插入节点:
3、遍历(广搜思想):
注意ans.clear()的使用及输入是否合法的判断
4、读入(此部分主要学习一下对字符串的处理技巧):
:从字符串s的s[1]位置开始找到一个整数并赋值给v
:传入两个字符数组(注意不是地址),按位比较,当出现不同是返回二者对应位的差值;若完全相同,则比较完毕后返回0
:查找‘,’的位置,此处目的:根据输入插入节点
:dirs为字符数组,c为char型变量,返回c在字符数组中的位置(即第几个)
5、释放内存:
技巧:若一个结构体有多个变量(假设有n个),则可以用一个n维数组来存储其父结点或子结点(根据输出时的查找需要)
二叉树的遍历3:(代码来源于洛谷)
思路:结构体配合深搜:
1、插入节点:
用结构体初始化的写法,不用new操作
插入完毕要记得更新:
2、查找某结点(也可能未插入)在树中的排名(按数值大小):
3、查找树中相应排名的结点:
4、搜索技巧:
思路:以父节点和子节点为边界不断向外扩展,同时用一个数组做标记,确保不重复访问
附上洛谷题解的更优代码: