DataStructure_Algorithm_HandBook_PreForLeetCode

右移操作在计算机科学中是一种位操作,用于对二进制数进行操作,具体来说是将数字的所有位向右移动指定的位数。在 Java 中,右移操作符有两种:有符号右移(»)和无符号右移(»>)。对于这个问题,我们主要关注有符号右移(»)。

有符号右移(») 当你对一个数执行有符号右移操作时,你实际上是在将这个数除以 2^𝑛,其中 n 是你移动的位数。这个操作的特点是保持数字的符号位(即最左边的位)不变,这对于处理负数时非常有用。如果数字是正的,右移就是简单地将每一位向右移动,空出的位用0填充;如果数字是负的,空出的位则用1填充,确保数字的符号保持为负。

示例 假设有一个整数 14,其二进制表示为 1110。如果我们对它执行 14 » 1 操作(向右移动一位),结果将是 7,其二进制为 0111。这相当于对 14 进行了除以 2 的操作。

在二分查找中的应用 在二分查找算法中,通常需要计算中点索引,如果使用常规的除法运算,即 (l + r) / 2,这可能会在特定语言和环境下因为整数溢出而导致问题。为了防止这种情况,可以使用右移操作来安全地计算中点,即 (l + r) » 1。这不仅避免了溢出,还比直接使用除法略微提高了计算效率。

右移操作 (l + r + 1) » 1 在代码中用于确保当 l 和 r 相差1时,中点 mid 取的是右边界,这对保持二分查找的正确性和效率非常关键。这种加1然后右移的策略是为了在二分查找中保证当搜索区间剩下两个元素时,能够正确地收敛到正确的边界。

在完全二叉树中,如果某一层的高度是 h,那么这一层(如果是满的)将包含 2^h 个节点。这是因为完全二叉树每一层的节点数是上一层节点数的两倍。例如,根节点所在的层(高度为 0)有 2^0 = 1 个节点,第一层有 2^1 = 2 个节点,以此类推。

在上述代码中,当考虑一个节点的左子树时,左子树的高度比整个树的高度少一。因此,如果整个树的高度是 h,那么左子树的高度是 h-1。如果左子树是满的,它将包含所有可能的节点,即 2^(h-1) 个节点。这里是详细的解释: