
获得徽章 0
- 打卡第十五天 今天学习了完全二叉树
以下是一些总结
具有n个结点的完全二叉树的深度为⌊log 2n⌋+1。(向下取整符号类似于3.5求3)
- 叶子结点个数。
- 当n为奇数的时候(即度为1的结点数为0个):n_0 = {n+1}/{2}
- 当n为偶数的时候(即度为1的结点数为1个):n_0 = {n}/{2}
- 任一结点i。
1. 双亲:⌊{i}/{2}⌋
2. 左孩子:2i
3. 右孩子:2i+1
- 在n个结点的二叉链表中。
- 有n+1个空指针域。
- 2n个链域(指针域)。
- 有n-1个链域存放指针,指向非空子女结点。(n-1条边)展开评论点赞 - 打卡第十三天 因为要备战面试 今天继续学习数据结构
以下是我对二叉树的一些总结
1. 子树有左右之分,次序不能颠倒。
2. 在二叉树第i层上至多有2^{i-1}个结点(i≥1)。
3. 第i层上至少有1个结点。
4. 深度为k的二叉树至多有2^{k}-1个结点。
5. 若k≥1,则深度为k时至少有k个结点。
若k≥0,则深度为k时至少有k+1个结点。
6. n结点数、n0叶子、n1度为1、n2度为2。
n0 = n2+1
总边数:B = n-1 = n2 * 2 + n1 * 1
7. 总结点数:n = n2 * 2 + n1 * 1 + 1
n = n2 + n1 + n0展开评论点赞 - 打卡第十天 今天继续学习typescript 遇到了一个很奇怪的问题,关于字面量赋值检测
比如定义了一个接口
IPerson {name:string, age:number}
此时如果再定义一个IPerson类型的变量,有两种情况都不会报错
① const info: Person = {name: 'aka', age: 18}
② const obj = {name: 'aka', age: 18, height: 2.35}
const aka: Person = obj
可以看到,在第二种情况的时候,ts的类型检测此时并不严格。
因为ts只有在初次定义的时候才会进行严格的字面量检测,而对于非初次定义的变量,不会进行严格的检测(不会检测多出来的参数类型)展开评论点赞 - 打卡第七天 学了useCallback的hook
前提:const [count, setCount] = useState(0)主要总结
1.每次重新渲染时,函数组件会被重新执行,而在这里又重新调用了useCallback函数,并且传了个函数作为值
而此时传入的这个函数,其实在每次重新渲染时又会重新被定义一次(因为每次都会在useCallback传值)所以这种写法并没有做性能优化
// const add = useCallback(() => {
// setCount(count + 1)
// })
2.闭包陷阱:因为传递第二个参数时,add是有记忆的,只会在最开始的时候采用useCallback传入的回调函数
之后的渲染因为没有依赖的值,所以不会重新赋新传入的回调函数,所以不管传入多少次回调函数
始终count的值一直都是第一次用的count(闭包)
/*const add = useCallback(() => {
console.log('add')
setCount(count + 1)
}, [])*/展开评论点赞 - 打卡第六天 今天学习了redux的使用,发现它的整体操作类似于vuex。目前学到的是早期的版本。
步骤如下:
1.编写reducer函数(作用是将数据和操作连接起来),返回值是新的state值,最终redux的state会被这个返回值覆盖
2.通过createStore创建store并传入reducer
3.在componentDidMount订阅store变化,并将最新的redux的state赋值给组件的state
4.监听事件去派发store更新,传入{type:xxx, ....}对象,其中type用于在reducer区分不同的操作
5....(目前还没学到其他)展开评论点赞