刷题笔记2022.3.6
- 颠倒32位二进制。uint32_t :unsigned (无符号)int 32位。
(n & 1):取二进制的最末位。<<:左移。注意for循环的使用,。
- 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。标签是位运算,不会,只能想到哈希表。
数组中的全部元素的异或运算结果即为数组中只出现一次的数字。
规则:相同为0,相异为1,0∧0=0,0∧1=1,1∧0=1,1∧1=0 ^
- 验证是二叉搜索树。
递归比中序遍历简单我觉得。
但是递归真的不好卡,做起来反倒不如中序遍历简单。
递归:LONG_MIN, LONG_MAX实数的上下界,可以用。Helper函数谁在跟谁比要想清楚。
中序遍历:如果中序遍历得到的节点的值小于等于前一个 inorder,说明不是二叉搜索树。这里只能用非递归遍历,因为要用栈进行元素间的比较。
先是左子树一溜进栈,取栈顶用最后指向右子树(在循环里),返回false的条件是<=low,low一直在更新。
- 给定一个二叉搜索树 root 和一个目标结果 k,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true。这个难度是简单吗?我第一思路是遍历,把值放数组里,再挨个看有没有匹配的。但是想想就空间复杂度贼高。
注意set不能【】,只能insert来插入。自己能做出来
- 返回:最近公共祖先,表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。应该用dfs,但是我好像不会呢。
其实不用dfs,用一个while循环,用bst特性最后返回ancestor。
注意if和else if是不一样的。