【HBU】数据结构树练习题

4-1

某二叉树的前序和后序遍历序列正好相反,则该二叉树一定是 (4分)

  1. 空或只有一个结点
  2. 高度等于其结点数
  3. 任一结点无左孩子
  4. 任一结点无右孩子

作者: DS课程组

单位: 浙江大学

 

4-2

已知一棵二叉树的先序遍历结果是ABC,则以下哪个序列是不可能的中序遍历结果: (4分)

  1. ABC
  2. BAC
  3. CBA
  4. CAB

作者: DS课程组

单位: 浙江大学

4-3

如果二叉树的后序遍历结果是FDEBGCA,中序遍历结果是FDBEACG,那么该二叉树的前序遍历结果是什么? (4分)

  1. ABCDEFG
  2. ABDFEGC
  3. ABDFECG
  4. ABDEFCG

作者: DS课程组

单位: 浙江大学

4-4

给定二叉树如下图所示。设N代表二叉树的根,L代表根结点的左子树,R代表根结点的右子树。若遍历后的结点序列为3、1、7、5、6、2、4,则其遍历方式是: (4分)

  1. NRL
  2. RNL
  3. LRN
  4. RLN

作者: DS课程组

单位: 浙江大学

4-5

在下述结论中,正确的是: (4分)

①只有一个结点的二叉树的度为0;

②二叉树的度为2;

③二叉树的左右子树可任意交换;

④深度为K的完全二叉树的结点个数小于或等于深度相同的满二叉树。

  1. ①④
  2. ②④
  3. ①②③
  4. ②③④

作者: DS课程组

单位: 浙江大学

4-6

任何一棵二叉树的叶结点在先序、中序和后序遍历序列中的相对次序 (4分)

  1. 发生改变
  2. 不发生改变
  3. 不能确定
  4. 以上都不对

作者: DS课程组

单位: 浙江大学

4-7

按照二叉树的定义,具有3个结点的二叉树有几种? (4分)

  1. 3
  2. 4
  3. 5
  4. 6

作者: DS课程组

单位: 浙江大学

4-8

下面的函数PreOrderPrintLeaves(BinTree BT)按前序遍历的顺序打印出二叉树BT的所有叶子结点。则下列哪条表达式应被填在空中?(4分)

void PreOrderPrintLeaves( BinTree BT )
{  if (BT)  {
      if (___________________)  printf("  %d", BT->Data);
      PreOrderPrintLeaves( BT->Left  );
      PreOrderPrintLeaves( BT->Right );
   }
}
  1. BT->Data != 0
  2. !BT->Right
  3. !BT->Left
  4. !(BT->Left || BT->Right)

作者: 何钦铭

单位: 浙江大学

4-9

要使一棵非空二叉树的先序序列与中序序列相同,其所有非叶结点须满足的条件是:(4分)

  1. 只有左子树
  2. 只有右子树
  3. 结点的度均为1
  4. 结点的度均为2

作者: 考研试卷

单位: 浙江大学

4-10

若将一棵树 T 转化为对应的二叉树 BT,则下列对 BT 的遍历中,其遍历序列与 T 的后根遍历序列相同的是:(4分)

  1. 先序遍历
  2. 中序遍历
  3. 后序遍历
  4. 按层遍历

作者: 考研真题

单位: 浙江大学

``` /* 转换为二叉 题目说明:建立一棵,将其转化为二叉,并给出该二叉的先序遍历序列。 要求:为任意输入,以孩子链表法存储,转换所得二叉以二叉链表为存储结构。 */ #include <stdio.h> #include <stdlib.h> #define MAX_TREE_SIZE 100 #define OVERFLOW -2 #define TRUE 1 #define FALSE 0 typedef int TElemType; typedef int Status; #define OK 1 void visit(TElemType e) { printf("%d", e); } typedef struct CTNode { //孩子结点 int child; struct CTNode *next; }*ChildPtr; typedef struct { TElemType data;//结点值 ChildPtr firstchild; //孩子链表头指针 //可增设一个双亲的域,能方便地找到其双亲。int Parent; }CTBox; typedef struct { CTBox nodes[MAX_TREE_SIZE]; //建立顺序表头结构 int n, r; //结点数和根的位置 }CTree; typedef struct BTNode { int data; CTBox list[MAX_TREE_SIZE]; struct BTNode *lchild; struct BTNode *rchild;//兄弟结点 }BTNode; typedef struct { CTBox list[MAX_TREE_SIZE];//邻接表表头 int n;//结点个数 }Tree;//定义 //--------------的孩子链表存储表示------------------- Status CreateTree(CTree &T) { //构建一棵 int i; printf("请输入结点数及根结点的位置下标:\n"); scanf("%d %d",&T.n, &T.r); printf("请输入各节点的值\n"); for(i = 0; i < T.n; ++i) { scanf("%d",&T.nodes[i].data); T.nodes[i].firstchild = NULL; } printf("创建每个结点的孩子结点...\n"); system("pause"); for(i =0; i < T.n; ++i) { printf("请输入位置为%d的结点的孩子个数(>=0)(有孩子则输入孩子们的位置,无则输入0):\n",i); int nChild=0; scanf("%d",&nChild); ChildPtr p=NULL; //p指向插入孩子位置的前一个位置 ChildPtr q=NULL; //q用于提示即将插入的新b孩子链表结点 for(int j = 0; j < nChild; ++j) { q= (ChildPtr)malloc(sizeof(struct CTNode));//为孩子的位置开辟一个空间 if(!q) exit(OVERFLOW); scanf("%d",&(q->child)); //将孩子链表结点置入位置值 q->next = NULL; if(j == 0)//将孩子链表头结点指向孩子链表第一个结点 { T.nodes[i].firstchild = q; } else { p->next = q; } p = q; } } return OK; } Status PrintChild(const ChildPtr &C) {//打印出结点的孩子 if(C) { ChildPtr p; p = C; while(p) { printf("[%d| ] ->",p->child); p = p->next; } printf("^"); //return TRUE; } else { printf("^"); //return FALSE; } } void PrintChildTree(const CTree &T)//输出的结点及他们的孩子 { printf("\n位置%d为的根%d\n\n", T.r, T.nodes[T.r].data); for(int i = 0; i < T.n; ++i) { printf("位置%d,结点值[%d| ] ->", i, T.nodes[i].data); PrintChild(T.nodes[i].firstchild); printf("\n"); } printf("---建立成功----"); } //--------------转化为二叉-------------- ? void treeToBtree(Tree *t,BTNode *bt,int i) {//转二叉 if(t != NULL) { CTBox *p = &(t->list[i]); bt->list[i]= t->list[i];//二叉的头结点等于的头结点 ChildPtr b = p->firstchild;//该结点的孩子结点 BTNode *q = bt->lchild;//二叉的左孩子结点 while(b)//把该层的全部转为二叉 { treeToBtree(t,q,b->child);//若该结点以及该结点的子孙结点转为二叉 b = b->next;//指向结点下一个孩子结点 q = q->rchild;//指向二叉的右孩子结点 } } } void PrintAsTree(BTNode *T,int i) //显示转化结果 { int cnt; if (T!=NULL) { printf("转化后的二叉:"); for (cnt=1; cnt<i; cnt++) //visit(T->data); printf("\n"); printf("位置%d,结点值[%d| ] ->", cnt, T->data); PrintAsTree(T->lchild, i+1); //遍历左孩子 PrintAsTree(T->rchild, i); //遍历右孩子 } } //---------------二叉的先序遍历---------------- void PreOrder(BTNode *T) { if(T==NULL) return; else { printf("二叉的先序遍历结果为:"); printf("%d--",T->data); PreOrder(T->lchild); PreOrder(T->rchild); } } int main() { CTree T; Tree *Y; BTNode *bt; ChildPtr C; int i; i=T.n; CreateTree(T); PrintChildTree(T);//输出普通的结点值 PrintChild(C); //输出各结点的孩子结点值 treeToBtree(Y,bt,i);//转化为二叉 PrintAsTree(bt,i);//输出转化后的二叉 PreOrder(bt); //输出二叉的先序遍历序列 return 0; } ```
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页