已知如下11个元素的有序表(8,16,19,23,39,52,63,77,81,88,90),画出其二分查找的判定树,给出查找元素88和17的折半查找过程。
时间: 2023-09-13 12:05:22 浏览: 48
二分查找的判定树如下所示:
```
52
/ \
19 81
/ \ / \
8 39 63 88
/ \ \
23 77 90
```
查找元素88的过程如下:
1. 从根节点52开始,将88与根节点的元素比较,发现88比52大,因此在右子树中查找。
2. 在右子树的根节点81处,将88与81比较,发现88比81小,因此在左子树中查找。
3. 在左子树的右子树中查找,发现88与90不相等,再在左子树的左子树中查找,发现88与77不相等,最后在左子树的根节点63处查找,发现88与63不相等,但是因为此时已经到达叶子节点,无法继续查找,因此查找失败。
查找元素17的过程如下:
1. 从根节点52开始,将17与根节点的元素比较,发现17比52小,因此在左子树中查找。
2. 在左子树的根节点19处,将17与19比较,发现17比19小,因此在左子树中查找。
3. 在左子树的右子树中查找,发现17与23不相等,而左子树的左子树是空的,因此查找失败。
相关问题
编写实现将两个已知的有序链表合并成一个有序链表的函数
### 回答1:
可以使用递归的方式,首先将第一个链表头节点与第二个链表头节点进行比较,将其中较小的节点作为新链表的头节点,并将其指针指向递归调用的下一个节点,直至一个链表遍历完毕,最后将另一个链表剩下的节点添加到新链表的尾部即可。
### 回答2:
有序链表是指链表中的节点按照一定的顺序排列,比如从小到大或从大到小。假设现在有两个已知的有序链表 A 和 B,现在需要将它们合并成一个有序链表 C。
一个比较直接的思路是,定义一个新的链表 C,然后对 A 和 B 进行遍历,比较它们当前节点的值,将较小的节点加入到 C 中。具体步骤如下:
1. 定义一个新的链表 C,初始化为空链表。
2. 遍历链表 A 和 B,比较它们当前节点的值。
3. 如果 A 的节点值小于 B 的节点值,则将 A 的节点加入到 C 中,并将 A 的指针后移一个位置。
4. 如果 B 的节点值小于等于 A 的节点值,则将 B 的节点加入到 C 中,并将 B 的指针后移一个位置。
5. 重复步骤 3 和 4,直到 A 或 B 遍历完。
6. 将 A 或 B 中剩余的节点全部加入到 C 中。
合并完成后,返回链表 C 即可。可以看出,这个算法的时间复杂度为 O(n),其中 n 是两个链表的长度之和。
代码实现:
```python
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def merge_two_lists(l1: ListNode, l2: ListNode) -> ListNode:
dummy = ListNode(-1) # 定义一个哑节点作为链表的头节点
cur = dummy # 定义一个指针来遍历链表
while l1 and l2:
if l1.val <= l2.val:
cur.next = l1
l1 = l1.next
else:
cur.next = l2
l2 = l2.next
cur = cur.next
if l1:
cur.next = l1
if l2:
cur.next = l2
return dummy.next
```
### 回答3:
将两个已知的有序链表合并成一个有序链表的函数,需要知道有序链表的特点:每个节点的值按照一定顺序排列,方便于查找和遍历。这个函数的主要步骤如下:
1. 定义一个新的链表作为合并后的有序链表。
2. 比较两个链表头部的节点值,将较小值的节点插入到新链表中,并将指针指向下一个节点。
3. 重复步骤2直到其中一个链表为空。
4. 将另一个非空的链表插入到新链表的末尾,合并完成。
具体实现如下:
```
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
struct ListNode dummy = {0};
struct ListNode* tail = &dummy;
while (l1 && l2) {
if (l1->val < l2->val) {
tail->next = l1;
l1 = l1->next;
} else {
tail->next = l2;
l2 = l2->next;
}
tail = tail->next;
}
tail->next = l1 ? l1 : l2;
return dummy.next;
}
```
这个函数首先定义了一个新的链表dummy,并且用tail指针记录新链表的末尾。然后使用一个循环,比较l1和l2头部节点值的大小,将较小的节点插入到新链表tail的后面,并且将指针指向下一个节点。当其中一个链表为空时,直接将另一个非空的链表插入到新链表的末尾,合并完成。最终返回dummy.next,也就是合并后的有序链表的头节点。
【实验题目】:已知顺序存储的两个有序表la=(2,8,10,20和lb=(3,8,9.15,16,保持
已知顺序存储的两个有序表la=(2,8,10,20)和lb=(3,8,9,15,16),现需要保持它们的有序性。
为了合并两个有序表,我们可以使用归并排序算法。首先创建一个新的有序表lc,然后分别从la和lb的开头开始比较元素。
我们可以设置两个指针,一个指向la的第一个元素,一个指向lb的第一个元素。比较这两个指针指向的元素,将较小的元素添加到lc中,并将该指向较小元素的指针向后移动一位。重复这个过程,直到其中一个有序表的元素全部添加到lc中。
当其中一个有序表的指针移动到了末尾时,将另一个有序表剩余的元素依次添加到lc中。最后,lc中的元素即为合并后的有序表。
根据上述步骤,我们将得到合并后的有序表lc=(2,3,8,8,9,10,15,16,20)。这样就完成了保持有序性的操作。
需要注意的是,我们可以在不使用额外空间的情况下,将lc的数据存储在la中,或者新开辟一个空间存储lc。但为了保持代码的简洁性和易读性,我选择将合并后的有序表存储在一个新的空间lc中。