1>已知树的先序遍历是GDAFEMHZ,中序的遍历是ADEFGHMZ,则后序遍历的结果是()
A.AMZHEFDG
B.ADFEHZMG
C.AEFDHZMG
D.AEFDMZHG
2>已知某二叉树的后序遍历序列是dabec,中序遍历是debac,它的先序遍历序列是()
A.cedba
B.decab
C.acbed
D.deabc
3>一颗二叉树中 度为1的结点有3个,度为2的结点有4个,则该二叉树总共有()个结点
A.10
B.不确定
C.12
D.7
3*1+2*4+1=12
4>若二叉树中结点的中序序列是abcdef,则结点的先序序列可能是()【多选】
A.efbacd
B.dbacef
C.bafdce
D.acbedf
BCD
5>某二叉树的中序序列为ABCDEFG,后序序列为BDCAFGE,则其左子树中结点数目为()
A.5
B.4
C.2
D.3
6>已知一颗二叉树的前序序列是BEFCGDH,中序序列是FEBGCHD,则它的后序序列必是FEGHDCB
A.对
B.错
7>二叉树的创建和遍历
#ifndef __BHEAD_H__
#define __BHEAD_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char datatype;
typedef struct Node
{
datatype data;
struct Node *left;
struct Node *right;
}*Btree;
Btree create();
void first(Btree T);
void mid(Btree T);
void last(Btree T);
#endif
#include "Bhead.h"
/*
* function: 创建二叉树输入
* @param [ in]
* @param [out]
* @return 成功返回二叉树首地址 失败返回NULL
*/
Btree create()
{
datatype e;
printf("请输入数据元素:");
scanf("%c",&e);
getchar();
if('#'==e)
return NULL;
Btree T=(Btree)malloc(sizeof(struct Node));
if(NULL==T)
return NULL;
T->data=e;
T->left=create();
T->right=create();
return T;
}
/*
* function: 先序遍历
* @param [ in] 二叉树
* @param [out]
* @return 无返回
*/
void first(Btree T)
{
if(NULL==T)
return;
printf("%c\t",T->data);
first(T->left);
first(T->right);
}
/*
* function: 中序遍历
* @param [ in] 二叉树
* @param [out]
* @return 无返回
*/
void mid(Btree T)
{
if(NULL==T)
return;
mid(T->left);
printf("%c\t",T->data);
mid(T->right);
}
/*
* function: 后序遍历
* @param [ in] 二叉树
* @param [out]
* @return 无返回
*/
void last(Btree T)
{
if(NULL==T)
return;
last(T->left);
last(T->right);
printf("%c\t",T->data);
}
#include "Bhead.h"
#include "Btest.c"
int main(int argc, const char *argv[])
{
Btree T=create();
printf("先序遍历的结果是:");
first(T);
putchar('\n');
printf("中序遍历的结果是:");
mid(T);
putchar('\n');
printf("后序遍历的结果是:");
last(T);
putchar('\n');
return 0;
}
8>快速排序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
* function: 确定基准值
* @param [ in]
* @param [out]
* @return 基准值
*/
int one_sort(int arr[],int low,int high)
{
int key=arr[low];//把数组第一个值确定为基准值
//low=high循环结束
while(low<high){
//把小于基准值的放到左边
while(low<high&&key<=arr[high]){
high--;
}
arr[low]=arr[high];
//把大于基准值的放到右边
while(low<high&&key>=arr[low]){
low++;
}
arr[high]=arr[low];
}
arr[low]=key;//确定基准值的位置并复制 此时low==high
return low;
}
/*
* function: 快排
* @param [ in]
* @param [out]
* @return
*/
void qksort(int arr[],int low,int high)
{
//当数组只有一个元素,不需要排序 low==high
//当数组有多个元素,排序 low<high
if(low<high){
int mid=one_sort(arr,low,high);
//递归左边
qksort(arr,low,mid-1);
//递归右边
qksort(arr,mid+1,high);
}
}
/*
* function: 遍历
* @param [ in]
* @param [out]
* @return
*/
void output(int arr[],int len)
{
int i;
for(i=0;i<len;i++){
printf("%d\t",arr[i]);
}
putchar('\n');
}
int main(int argc, const char *argv[])
{
int arr[]={89,12,56,34,54,78};
int len=sizeof(arr)/sizeof(int);
qksort(arr,0,len-1);
output(arr,len);
return 0;
}
9>直接插入排序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void insert_sort(int *p,int len)
{
int i,j;
for(i=0;i<len;i++){
int temp=*(p+i);//有序去移动会覆盖无序区第一个元素 定义变量temp临时存储
for(j=i-1;j>=0&&temp<*(p+j);j--){
*(p+j+1)=*(p+j);
}
*(p+j+1)=temp;//循环j-- 所以arr[j+1]和temp交换
}
}
void output(int *p,int len)
{
int i;
for(i=0;i<len;i++){
printf("%d\t",*(p+i));
}
putchar('\n');
}
int main(int argc, const char *argv[])
{
int arr[]={89,12,56,34,54,78};
int *p=arr;
int len=sizeof(arr)/sizeof(int);
insert_sort(p,len);
output(p,len);
return 0;
}