C语言数据结构练习与知识总结

单链表的尾插:一.找尾节点

                         二.尾节点的next指向要尾插的节点地址

所以选A

满二叉树:每一层节点的顺序都是从左到右依次排序,且每一层节点的个数都达到最大。

完全二叉树:每一层节点的顺序都是从左到右依次排序,第k-1层外每一层节点的个数都达到最大,第k层节点的个数不一定达到最大。

所以选A

已知n2=199,求n0

任意一颗二叉树都满足n0=n2+1

所以选B

顺序表中的删除:不是将其移除,而是将要删除的元素后面的元素往前挪动,将要删除的元素覆盖。

顺序表中的插入:将要插入的位置后面所有的元素往后挪动,将要插入的元素插入。

所以选A

完全二叉树的重要应用是:堆排序

所以选D

顺序表(数组):插入数据(要将插入的位置及以后的数据往后挪动一位)

链表(节点):插入数据(只需要修改next指针的指向)

所以选B

根据前序和中序画出树

得出

所以选C

选D 

栈的原则:先进后出

A:全进全出 可以

B:进一个出一个 可以

C:进三个出三个 再进一个出一个

所以选D

筛选法建堆:向下调整算法建堆

根据孩子节点的下标求父节点的下标:parent=(child-1)/2

所以选C

排升序建大堆 降序建小堆

向下调整算法

所以选C

同理选C

时间复杂度为O(nlog2n)的排序:快速排序,堆排序,归并排序 

稳定的是:归并排序

所以选C

快速排序不稳定

 选B

编程题

一.左叶子之和

叶子节点:左右孩子都为空的节点

解题思路:

1.判断树是否为空树,为空返回0

2.不是空树 判断左孩子是否是左叶子节点,如果是就保存,继续遍历 然后累加

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param root TreeNode类 
 * @return int整型
 */
int sumOfLeftLeaves(struct TreeNode* root )
 {
   //判断是否为空
   if(root==NULL)
   {
    return 0;
   }
   int sum=0;
   //判断当前节点的左孩子是非为左叶子节点
   if(root->left&&root->left->left==NULL&&root->left->right==NULL)
   {
        sum=root->left->val;
   }
   return sum+sumOfLeftLeaves(root->left)+sumOfLeftLeaves(root->right);
}

二.环形链表的约瑟夫问题

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param n int整型 
 * @param m int整型 
 * @return int整型
 */
  typedef struct ListNode ListNode;
  ListNode*buyNode(int x)
  {
    ListNode*newnode=(ListNode*)malloc(sizeof(ListNode));
    if(newnode==NULL)
    {
        exit(2);
    }
    newnode->val=x;
    newnode->next=NULL;
    return newnode;
  }
  ListNode*creatlist(int n)
  {
    ListNode*phead,*ptail;  
    int i=1;
    phead=ptail=buyNode(i++);
    while(i<=n)
    {
        ptail->next=buyNode(i++); 
        ptail=ptail->next;
    }
    ptail->next=phead;
    return phead;
    
    
  }
int ysf(int n, int m )
 {
//根据给定的链表长度创建单项循环链表
ListNode*head=creatlist(n);
ListNode*cur=head;
ListNode*prev=NULL;
int i=1;
while(cur->next!=cur)
{
    if(i==m)
    {
        prev->next=cur->next;
        free(cur);
        cur=prev->next;
        i=1;
    }
    else 
    {
        prev=cur;
        cur=cur->next;
        i++;
    }
    
}
return cur->val;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值