数据结构实验教程-第一套

1.在平衡二叉树中插入一个结点后造成了不平衡,设最低的不平衡结点为A,并已知A的左孩子的平衡因子为1,右孩子的平衡因子为0,则应作_型调整以使其平衡。
A.LL
B.LR
C.RL
D.RR

答案为a,错选了c。
平衡因子 = 左子树高度 - 右子树高度
错因:找到了最小不平衡子树为左孩子的左子树(LL)应做右单旋转,但这个操作的名称叫LL。

LL:右单旋转
RR:左单旋转
LR:左旋转再右旋转
RL:右旋转再左旋转

线性表中每个元素都有一个前驱和一个后继元素。

这个说法是不对的,第一个元素无前驱节点,最后一个元素无后继节点。

若从某顶点出发对无向图G进行深度优先搜索遍历,所得的遍历序列唯一,则可断定图中有两个顶点的度为1。

这个说法是正确的。(就算是环,也有两种序列,因为是无向图)

广义表A=(((a,b),(c,d),e)),取出A中的原子e的操作是_

在广义表中,head取出的是表中第一个元素,tail取出的是当前表的下一个元素。
因此答案为:head ( tail ( tail ( head(A) ) ) )

解答本题时,首先要清楚取表头和表尾运算 head 和 tail运算的含义: head(A)返回A表中的第一个元素;tail(A)则返回在A表中去掉第一个元素后所得到的表。
为取出元素e,首先要将e所在的元素(子表〉取出来,即执行head(A),得到A的第一个元素((a,b).(c,d),e),由于e是其中第三个元素,故要连续去掉其前面两个元素,即执行两次取表尾元素,然后再执行取表头运算,按由里到外的次序合成得到答案。
类似地,若要取出其中的原子b,其复合函数应是head(tail(head(head(A)))).

9.在有序表A[22]中,按二分查找方法进行查找,查找值为A[15]的元素依次比较的元素的下标是

第一次 mid = (0+21)/2 = 10
第二次
low = mid+1 = 11
mid = (11+21)/2 = 16
第三次
high = mid-1 = 15
mid = (15+11)/2 = 13
第四次
low = mid + 1 = 14
mid = (14+15)/2 = 14
第五次
low = mid + 1 = 15
mid = (15+15)/2 = 15

因此搜索下标应该为 10 16 13 14 15
关键在于更新时,若low更新因为low = mid - 1 若high更新应为high = mid+1,别把+1或者-1忘了

3.已知散列表的地址空间为0~13,散列函数为H(k)=k%13,用线性探查法处理冲突。
将下列元素依次插入到初值为空的散列表中,画出该表,并求出在等概率情况下,查找成功时的平均查找长度。
( 11,22,33,57,65,31,43,98,77,100,30,28)

注意要看清是如何解决冲突的,别想当然用拉链法去解决。最终答案为2.

2.设计算法按先序次序遍历先序线索二叉树。要求采用非递归形式,且不用栈。
BiTnode *NextNode(BiTnode *p){
    if(p->ltag == 0) return p->lchild;
    //如果有左孩子,后继是其左孩子
    else return p->rchild;
    //没有左孩子的话后继是右孩子或者后继线索
}

void PreTraverse(BiTnode *t){
    BiTnode *p = t;
    //第一个节点为t
    for(;p;p = NextNode(p))
        visit(p)
}

与之相对应的是中序线索二叉树的遍历,注意进行区分。

BiTnode *FirstNode(BiTnode *t){
    //找到中序的第一个节点
    while(p->tag == 0) p = p->lchild;
    return p;
    //最左下节点
}

BiTnode *NextNode(BiTnode *t){
    //找到中序后继节点
    if(t->rtag == 1) return t->rchild;
    //右孩子是线索,直接返回
    else return FirstNode(t->rchild);
    //返回右子树的第一个节点
}

void InTraverse(BiTnode *t){
    for(BiTnode *p = FirstNode(t);p;p = NextNode(p))
        visit(p);
}

注意上述代码第一个函数中while(p->ltag == 0) p = p->lchild;这个条件可不可以替换为while(p->lchild) p = p->lchild;显然是不可以的,因为在后续调用中, p = p->lchild有可能为线索这个条件一定要注意。
在这里插入图片描述

void swap(int *a,int *b){
    int tmp;
    tmp = *a;
    *a = *b;
    *b = tmp;
}
void sort(int a[],int n){
    int low = 0,high = n-1;
    while(low<high){
        while(a[low]%3 == 0)low++;
        while(a[high]%3 != 0) high--;
        if(low<=high) swap(&a[low],&a[high]);
        else break;
    }
    high = n-1;low++;
    while(low<high){
        while(a[low]%3 == 1)low++;
        while(a[high]%3 != 1) high--;
        if(low<=high) swap(&a[low],&a[high]);
        else break;
    }
    high = n-1;low++;
    while(low<high){
        while(a[low]%3 == 2)low++;
        while(a[high]%3 != 2) high--;
        if(low<=high) swap(&a[low],&a[high]);
        else break;
    }
}
int main()
{
    int num[] = {1,3,5,7,9,2,4,6,8,10};
    for(int i=0;i<10;i++){
        printf("%4d",num[i]);
    }

    printf("\n");
    sort(num,10);
    for(int i=0;i<10;i++){
        printf("%4d",num[i]);
    }
    return 0;
}

别忘了在swap前加一个判断是否low<high

在这里插入图片描述

struct TreeNode {
     int val;
     struct TreeNode *left;
     struct TreeNode *right;
 };


struct TreeNode* Build(int *preorder,int p1,int p2,int *order,int o1,int o2){
    struct TreeNode *root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
    root->val = preorder[p1];
    int mid;
    for(mid = o1;order[mid]!=root->val;mid++) ;
    int llen = mid - o1;
    int rlen = o2 - mid;
    if(llen){
        root->left = Build(preorder,p1+1,p1+llen,order,o1,o1+llen-1);
    }
    else
        root->left = NULL;
    if(rlen){
        root->right = Build(preorder,p2-rlen+1,p2,order,o2-rlen+1,o2);
    }
    else
        root->right = NULL;
    return root;
}
struct TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int inorderSize){
    struct TreeNode *root;
    root = Build(preorder,0,preorderSize-1,inorder,0,inorderSize-1);
    return root;
}

void traverse(struct TreeNode* t){
    if(!t) return;
    if(t->left)
        printf("( %d , %d )\n",t->val,t->left->val);
    traverse(t->left);
    traverse(t->right);

}
int main()
{
    int pre[] = {3,9,20,15,7};
    int in[] = {9,3,15,20,7};
    struct TreeNode* t = buildTree(pre,5,in,5);
    traverse(t);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
文名: 数据结构实验教程 作者: 张凤琴图书分类: 软件 资源格式: PDF 版本: 扫描版 出版社: 北方交通大学出版社书号: ISBN:7810827820发行时间: 2006年06月 地区: 大陆 语言: 简体文 简介: 内容简介   《数据结构实验教程》是为了让学生能够尽快地掌握数据结构的各种算法而编写的。本教材所写的算法具有程序结构清晰、可读性强、符合软件工程的规范要求等特点,所有的程序均在VC调试环境下运行通过,如果要运行程序,则仅需要编译一下便可。如果需要在TURBO C环境下运行,则仅需要将“//”注释修改一下便可。本书在数据结构的每个知识点上均给出了多个实验项目,且在每个实验项目包括实验项目、任务分析、程序构思、源程序、测试数据、注意事项及思考问题等。在最后一章给出了两个实际问题,着重分析了解决的思路、模块划分、重点难点等。本书共分9章,包括线性表、栈与队列、串、数组、树和二叉树、图、查找、排序和文件。   本书是清华大学出版社和北京交通大学出版社出版的《数据结构》教材(张凤琴主编)的配套实验教材,也可作为其他数据结构的实验教材及软件水平考试、计算机等级考试的上机指导、程序员编写算法的参考书。 内容截图 目录: 第一章 线性表 第二章 栈与队列 第三章 串 第四章 数组 第五章 树和二叉树 第六章 图 第七章 查找 第八章 排序 第九章 文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kilig*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值