引子:二分查找

int BinarySearch(StaticTable *Tbl,ElementType K)
{
    int left,right,mid,NotFound = -1;
    left = 1;
    right = Tbl->Length;

    while(left <= right)
    {
        mid = (left + right) / 2;
        if(K > Tbl->Element[mid])
            left = mid + 1;
        else if(K < Tbl->Element[mid])
            right = mid - 1;
        else
            return mid;
    }
    return NotFound;
}

在分量1~11的数组中按从小到大顺序存放11个元素,如果用顺序查找和二分查找分别查找这11个元素,哪个位置的元素在这两种方法的查找中总次数最少?1

在分量1~11的数组中按从小到大顺序存放11个元素,如果进行二分查找,查找次数最少的元素位于什么位置?6

测试程序如下:

#include <stdio.h>

int OrderSearch(int arr[],int n,int x)
{
    for(int i = 0 ; i < n; i++)
    {
        if(x == arr[i])
            return i;
    }
    return -1;
}

int BinarySearch(int arr[],int n,int x)
{
    int left = 0;
    int right = n-1;
    int mid;
    while(left <= right)
    {
        mid = (left + right) / 2;
        if(arr[mid] < x)
            left = mid + 1;
        else if(arr[mid] > x)
            right = mid - 1;
        else
            return mid;
    }
    return -1;
}

int main()
{
    int n = 10;
    int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    int x = 3;
    printf("%d\n",BinarySearch(arr,n,x));
    printf("%d\n",OrderSearch(arr,n,x));
    return 0;
}

ASL:Average Search Length平均查找长度

树的定义

有一个m棵树的集合(也叫森林)共有k条边,问这m颗树共有多少个结点?k+m

在用“儿子-兄弟”法表示的树中,如果从根结点开始访问其“次子”的“次子”,所经过的结点数与从根结点开始访问其“长子”的“长子”的“长子”的“长子”一样。(注意:比较的是结点数,而不是路径)

一棵度为 m的树有n个节点。若每个节点直接用m个链指向相应的儿子,则表示这个树所需要的总空间是n*(m+1) (假定每个链以及表示节点的数据域都是一个单位空间).。当采用儿子/兄弟(First Child/Next Sibling)表示法时,所需的总空间是:3n

树的集合称为森林。是否也可以使用“儿子-兄弟”表示法存储森林?如何实现?

是的,可以使用"儿子-兄弟"表示法(又称作"左孩子-右兄弟"表示法或"孩子兄弟链表")来存储森林,其中每个节点表示一棵树。这种表示法适用于多叉树和森林结构,它使用两个指针来表示树中的节点之间的关系:左孩子指针和右兄弟指针。左孩子指针指向当前节点的第一个子节点,而右兄弟指针指向当前节点的兄弟节点。