题目
My way
中序遍历用vector存储结果 + 按vector中结果依次构建树
1 | /** |
就地拼接 + 不使用额外空间复杂度
1 | /** |
Reference
https://leetcode-cn.com/problems/increasing-order-search-tree/solution/di-zeng-shun-xu-cha-zhao-shu-by-leetcode/
Just a Blog
1 | /** |
1 | /** |
https://leetcode-cn.com/problems/increasing-order-search-tree/solution/di-zeng-shun-xu-cha-zhao-shu-by-leetcode/
1 | class Solution { |
一种抽象的思维:
abs(dfs(node->left))
+ abs(dfs(node->right))
https://leetcode-cn.com/problems/distribute-coins-in-binary-tree/solution/zai-er-cha-shu-zhong-fen-pei-ying-bi-by-leetcode/
1 | /** |
利用了完全二叉树定义:
left == right
. 说明左子树一定是满二叉树,因为节点已经填充到右子树了,左子树必然填满了。所以左子树的节点总数我们可以直接得到,是\(2^{left }- 1\),加上当前这个root节点,则正好是\(2^{left}\)。再对右子树进行递归统计。left != right
. 说明此时到了树的倒数第二层了,且倒数第二层已经满了,可以直接得到右子树的节点个数。同理,右子树节点+root节点,总数为\(2^{right}\). 再对左子树进行递归查找。完全二叉树的定义引申出通过对左右孩子的判断,来得到对于节点个数的计算:
left == right
.
说明左子树一定是满二叉树,因为节点已经填充到右子树了,左子树必然填满了。所以左子树的节点总数我们可以直接得到,是\(2^{left }- 1\),加上当前这个root节点,则正好是\(2^{left}\)。再对右子树进行递归统计。
left != right
.
说明此时到了树的倒数第二层了,且倒数第二层已经满了,可以直接得到右子树的节点个数。同理,右子树节点+root节点,总数为\(2^{right}\). 再对左子树进行递归查找。
完全二叉树的高度:
树的高度 = 树的最左节点的深度
简单的位运算:
https://leetcode-cn.com/problems/count-complete-tree-nodes/
1 | /** |
1 | 1 |
1 | /** |
二叉树展开成为链表的结果就是 先序遍历 的结果。
但是按 先序遍历 结果来处理的话,更新当前结点的右指针的时候,当前结点的右指针就没有保存下来了。
1 | 1 |
所以思考 反过来,通过后序遍历 来处理。
1 | // postOrder |
即,每遍历一个节点,考虑将当前节点的 右指针 指向上一个节点。
1 | /** |
利用栈保存上一个节点的右指针,并将其更新为当前节点。
1 | /** |
https://leetcode-cn.com/problems/flatten-binary-tree-to-linked-list/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by--26/
求\(N!\)在尾部有多少个0,即求有多少个2和5.
由于实际上在\(N!\)中,2的个数多于5,所以求5的个数即可,所以结果是\(N/5\)吗?
并不是,因为每过\(5^i\)个数之后,都会多出现一个5.
\(result = N/5 + N/(5^2) + N/(5^3) + ... =((N/5)/5)/5...\)
1 | class Solution { |
https://leetcode-cn.com/problems/factorial-trailing-zeroes/solution/xiang-xi-tong-su-de-si-lu-fen-xi-by-windliang-3/
https://leetcode-cn.com/problems/factorial-trailing-zeroes/solution/q172-factorial-trailing-zeroes-by-ronhou/
1 | /** |
1 | /** |
sum
, maxLevel
也可以改成dfs
函数的引用参数。
我的思路是,自顶向下遍历到label
所在那一层的结点,赋值出来,然后先序遍历输出结果。感觉就不是最优解。
1 | def pathInZigZagTree(self, label: int) -> List[int]: |
因为以1为根节点层次编号的满二叉树可以对应到位的表示,所以用位运算的思路即可。
因为每层的顺序在变,所以每次需要对首位外的其它位取反。
举例14=1110b,
先将14右移,变为111b,然后对除第一位外所有位取反变为100b,即它的根节点4,
同理100b,右移变为10b,对除第一位外所有位取反变为11b,即它的根节点3
一直到1结束。
这是一道具有数学规律的题,不是很容易地可以发现根节点和两个孩子结点的规律。
根节点label = (孩子结点label / 2)除最高的1位之外后的所有位按位取反
怎么在C++里面统计一个数以二进制时,最后一位到最高的"1"位的位数。
1 | // 循环统计位数 |
1 | // 2^n > label >= 2^(n-1) - 1 |
https://stackoverflow.com/questions/25754082/how-to-take-twos-complement-of-a-byte-in-c
https://stackoverflow.com/questions/29388711/c-how-to-get-length-of-bits-of-a-variable