当前位置:文档之家› 数据结构练习(二叉树)

数据结构练习(二叉树)

数据结构练习(二叉树)学号31301374 姓名张一博班级软件工程1301 .一、选择题1.按照二叉树定义,具有3个结点的二叉树共有 C 种形态。

(A) 3 (B) 4 (C) 5 (D) 62.具有五层结点的完全二叉树至少有 D 个结点。

(A) 9 (B) 15 (C) 31 (D) 163.以下有关二叉树的说法正确的是 B 。

(A) 二叉树的度为2 (B)一棵二叉树的度可以小于2(C) 至少有一个结点的度为2 (D)任一结点的度均为24.已知二叉树的后序遍历是dabec,中序遍历是debac,则其前序遍历是 D 。

(A)acbed (B)decab (C) deabc (D) cedba5.将一棵有1000个结点的完全二叉树从上到下,从左到右依次进行编号,根结点的编号为1,则编号为49的结点的右孩子编号为 B 。

(A) 98 (B) 99 (C) 50 (D) 没有右孩子6.对具有100个结点的二叉树,若有二叉链表存储,则其指针域共有 D 为空。

(A) 50 (B) 99 (C) 100 (D) 1017.设二叉树的深度为h,且只有度为1和0的结点,则此二叉树的结点总数为 C 。

(A) 2h (B) 2h-1 (C) h (D) h+18.对一棵满二叉树,m个树叶,n个结点,深度为h,则 D 。

(A) n=h+m (B) h+m=2n (C)m=h-1 (D)n=2h-19.某二叉树的先序序列和后序序列正好相反,则下列说法错误的是 A 。

(A) 二叉树不存在(B) 若二叉树不为空,则二叉树的深度等于结点数(C) 若二叉树不为空,则任一结点不能同时拥有左孩子和右孩子(D) 若二叉树不为空,则任一结点的度均为110.对二叉树的结点从1开始进行编号,要求每个结点的编号大于其左右孩子的编号,同一结点的左右孩子中,其左孩子的编号小于其右孩子的编号,可采用 A 遍历实现编号。

(A) 先序(B)中序(C)后序(D)层序11.一个具有1025个结点的二叉树的高h为 C 。

(A) 10 (B)11 (C)11~1025 (D)10~102412.设n,m为一棵二叉树上的两个结点,在中序遍历时,n在m前的条件是 C 。

( A) n在m右方(B)n是m祖先(C) n在m左方(D) n是m子孙13.实现对任意二叉树的后序遍历的非递归算法而不使用栈结构,最佳方案是二叉树采用 C 存储结构。

(A) 二叉链表(B) 广义表(C)三叉链表(D)顺序14. 一棵树可转换成为与其对应的二叉树,则下面叙述正确的是 A 。

(A) 树的先根遍历序列与其对应的二叉树的先序遍历相同(B) 树的后根遍历序列与其对应的二叉树的后序遍历相同(C) 树的先根遍历序列与其对应的二叉树的中序遍历相同(D) 以上都不对二、填空题1.对一棵具有n个结点的二叉树,当它为一棵完全二叉树时具有最小高度;当它为单分支二叉树时,具有最大高度。

2.在二叉树的第i(i≥1)层上至多有2^(i-1) 个结点,深度为k(k≥1)的完全二叉树至多2^(k)-1 个结点,最少2^(k-1) 个结点;3.如果二叉树的终端结点数为n0,度为2的结点数为n2,则n0 = n2+1 。

4.已知一棵二叉树的中序序列是cbedahgijf,后序序列是cedbhjigfa,则该二叉树的先序序列是abcdefghij ,该二叉树的深度为 5 。

5.若一棵二叉树的中序遍历结果为ABC,则该二叉树有3中不同的形态。

6.在顺序存储的二叉树中,下标为i和j的两个结点处在同一层的条件是log(2)i=log(2)j 。

7.已知完全二叉树的第7层有8个结点,则其叶子结点数为36个。

总结点数为71个。

8.在对二叉树进行非递归中序遍历过程中,需要用栈来暂存所访问结点的地址;进行层序遍历过程中,需要用队列来暂存所访问结点的地址;9.高度为h,度为k的树中至少有h+k-1 个结点,至多有k^(h)-1 个结点。

10.一维数组存放完全二叉树:ABCDEFGHI,则后序遍历该二叉树的序列为HIDEBFGCA 。

三、应用题1. 应用题:说明分别满足下列条件的二叉树各是什么?⑴先序遍历和中序遍历相同;空树,只有一个跟节点或右单分支二叉树。

⑵中序遍历和后序遍历相同;空树,只有一个根节点或左单分支二叉树。

⑶先序遍历和后序遍历相同;空树,只有一个根节点的二叉树。

2. 已知一棵二叉树的中序序列是cbedahgijf,后序序列是cedbhjigfa,画出这棵二叉树的逻辑结构图。

A FB GC D H IE J3.一棵二叉树的先序、中序、后序序列如下,其中一部分未标出,试构造出该二叉树。

先序序列: A B C D E F G H I J K中序序列:C B E D F A H J K I G后序序列: C E F D B K J I H G A4.有n个结点的二叉树,已知叶子结点个数为n0,回答下列问题:(1)写出求度为1的结点的个数n1的计算公式;(2)若此树是深度为k的完全二叉树,写出n为最小的公式;(3)若二叉树中仅有度为0和度为2的结点,写出求该二叉树结点个数n的公式;(1) n1=n+1-2n0(2) n(min)=2^(k-1)(3) n=2n0-1四、算法设计题1.编写求二叉树BT中结点总数的算法。

int BTreeCount(BTreeNode *BT) //二叉树中结点的总数{if(BT==NULL)return 0;else if(BT->left==NULL&&BT->right==NULL)return 1;elsereturn BTreeCount(BT->left)+BTreeCount(BT->right)+1;}2.编写求二叉树BT中叶子结点数的算法。

int BTreeCount(BTreeNode *BT) //二叉树中结点的总数{if(BT==NULL)return 0;else if(BT->left==NULL&&BT->right==NULL)return 1;elsereturn BTreeCount(BT->left)+BTreeCount(BT->right);}3.若已知两棵二叉树BT1和BT2皆为空,或者皆不为空且BT1的左、右子树和BT2的左、右子树分别相似,则称二叉树BT1和BT2相似。

编写算法,判别给定的两棵二叉树是否相似。

int BTreeSim(BTreeNode *BT1,BTreeNode *BT1){if(! BT1 && ! BT2) return 1;else if(! BT1||! BT2) return 0;elsereturnBTreeSim(BT1->lchild,BT2->lchile)&&BTreeSim(BT1->rchild,BT2->rchild);}4.编写算法,求二叉树中以元素值为x的结点为根的子树的深度。

int BTreeSim(BTreeNode *BT , ElemType x){if(! BT) return 0;else if(BT->data==x) return DepthBTree(B)T;else if(BT->lchild!=NULL) return Get_Sub_Depth(BT->lchild ,x);else if(BT->rchild!=NULL) return Get_Sub_Depth(B)T->rchild,x;else return 0;}int DepthBTree(BTreeNode *BT) //求二叉树BT的深度{if(!BT) return 0;else{int dep1=DepthBTree(BT->lchild);int dep2=DepthBTree(BT->rchild);if(dep1>dep2)return dep1+1;elsereturn dep2+1;}}5.编写算法,计算二叉树中度为1的结点数和度为2的结点数。

int s1=0,s2=0;void BTreebranch(BTreeNode *BT){if(BT!=NULL){if(BT->lchild!=NULL){if(BT->rchild!=NULL) s2++;else s1 ++;BTreebranch(BT->lchild);}if(BT->rchild!=NULL){if(BT->lchild!=NULL) s1++;BTreebranch(B)T->rchild;}}}6.试利用栈的基本操作编写一个先序遍历的非递归算法。

Void PreOrder(BTreeNode *BT){InitStack(S);Push(S,T);While(!StackEmpty(S)){While(gettop(S,p)&&p){visit(p->data);Push(S,p->lchild);}Pop(S,p);if(!StackEmtpy(S)){Pop(S,p);Push(S,p->rchild);}}}。

相关主题