关于初学二叉树的一些总结

结构体的定义:

结构体初始化实现的几种方式:

这种不够保险:有时候需要有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、搜索技巧:

 思路:以父节点和子节点为边界不断向外扩展,同时用一个数组做标记,确保不重复访问

附上洛谷题解的更优代码:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值