在一个用数组表示的完全二叉树中,如果根结点下标为1,那么下标为17和19这两个结点的最近公共祖先结点在哪里(数组下标)? (注:两个结点的“公共祖先结点”是指同时都是这两个结点祖先的结点) 写出计算过程
时间: 2024-01-24 15:19:27 浏览: 395
在一个用数组表示的完全二叉树中,下标为 $i$ 的结点的父节点下标为 $\lfloor \frac{i}{2} \rfloor$,左子节点下标为 $2i$,右子节点下标为 $2i+1$。
首先,根据给定的下标,可以求出它们的深度,下标为 $17$ 的结点深度为 $4$,下标为 $19$ 的结点深度为 $3$。
接下来,从深度较大的结点开始,不断向上找它们的公共祖先结点,直到找到它们的最近公共祖先结点为止。具体过程如下:
- 下标为 $17$ 的结点的祖先结点为 $8$(深度为 $3$)。
- 下标为 $19$ 的结点的祖先结点为 $9$(深度为 $3$)。
- 下标为 $8$ 和 $9$ 的结点的祖先结点为 $4$(深度为 $2$)。
- 下标为 $4$ 的结点的祖先结点为 $2$(深度为 $1$)。
因此,下标为 $17$ 和 $19$ 的结点的最近公共祖先结点下标为 $2$。
相关问题
将一棵完全二叉树存于数组中(根结点的下标为1)。则下标为23和24的两个结点是兄弟
是的,下标为23和24的两个结点是兄弟节点。在完全二叉树中,如果一个节点的下标为i,则它的左子节点的下标为2i,右子节点的下标为2i+1,而它的父节点的下标为i/2。因此,下标为23和24的节点的父节点下标都为11,它们是同一层的两个节点,因此它们是兄弟节点。
一个排序二叉树结构,每个结点用圆圈表示,里面的数字表示存储在这个结点中的信息或者数值,每个圆圈外面的数字表示这个结点在二叉树中的编号。比如,根结点的标号为1,它的左孩子的编号为2,右孩子的编号为3。这个排序二叉树中,每个父亲结点中存储的数值都大于它的左子树中存储的所有数值,同时,也都小于它的右子树中存储的所有数值,编写一个函数,它的名字为:manageSortBinaryTree,该函数将这个二叉树存储成一个一维数组,我们用list(列表)来表示这个这个二叉树,列表中的下标与二叉树中的结点下标一一对应,即,二叉树中标号为2的结点存储在列表中下标为2的位置。在列表中,没有被使用的位置存储特殊字符。
好的,下面是manageSortBinaryTree函数的实现代码:
```python
def manageSortBinaryTree(root):
# 获取二叉树结点数量
n = countNodes(root)
# 初始化列表,下标从0开始,长度为n+1
tree_list = [""] * (n+1)
# 将二叉树中每个结点的值存储到列表中对应的位置
inOrder(root, tree_list)
return tree_list
# 统计二叉树中结点的数量
def countNodes(node):
if not node:
return 0
return 1 + countNodes(node.left) + countNodes(node.right)
# 中序遍历二叉树,将每个结点的值存储到列表中对应的位置
def inOrder(node, tree_list):
if not node:
return
inOrder(node.left, tree_list)
tree_list[node.val] = node.val
inOrder(node.right, tree_list)
```
这个函数接收一个二叉树的根节点作为参数,返回一个列表,列表中的下标与二叉树中的结点编号一一对应,列表中存储的是对应结点中的值或特殊字符。我们可以通过调用该函数来将一个排序二叉树存储成一维数组。
阅读全文