习题五参考答案
一、选择题
1.对一棵树进行后根遍历操作与对这棵树所对应的二叉树进行( B )遍历操作相同。
A. 先根          B. 中根        C. 后根            D. 层次
2.在哈夫曼树中,任何一个结点它的度都是( C )。
B. 01          B. 12      C. 02          D. 012
3.对一棵深度为h的二叉树,其结点的个数最多为( D )。
A. 2h          B. 2h-1        C. 2h-1            D. 2h-1
4.一棵非空二叉树的先根遍历与中根遍历正好相同,则该二叉树满足( A
A. 所有结点无左孩子          B. 所有结点无孩子
C. 只有一个根结点            D. 任意一棵二叉树
5.一棵非空二叉树的先根遍历与中根遍历正好相反,则该二叉树满足( B
B. 所有结点无左孩子          B. 所有结点无孩子     
C. 只有一个根结点              D. 任意一棵二叉树
6.假设一棵二叉树中度为1的结点个数为5,度为2的结点个数为3,则这棵二叉树的叶结点的个数是( C
A2          B. 3        C. 4            D. 5
7.若某棵二叉树的先根遍历序列为ABCDEF,中根遍历序列为CBDAEF,则这棵二叉树的后根遍历序列为( B )。
AFEDCBA          B. CDBFEA        C. CDBEFA            D. DCBEFA
8.若某棵二叉树的后根遍历序列为DBEFCA,中根遍历序列为DBAECF,则这棵二叉树的先根遍历序列为( B )。
AABCDEF          B. ABDCEF        C. ABCDFE            D. ABDECF
9.根据以权值为{257912}构造的哈夫曼树所构造的哈夫曼编码中最大的长度为( B
A2          B. 3        C. 4            D. 5
10.在有n个结点的二叉树的二叉链表存储结构中有( C )个空的指针域。
An-1          B. n        C. n+1          D. 0
二、填空题
1. 在一棵度为m的树中,若度为1的结点有n1个,度为2结点有n2个,……,度为m的结点有nm个,则这棵树中的叶结点的个数为  1+n2+2n3+3n4++(m-1)nm 
2. 一棵具有n个结点的二叉树,其深度最多为 n ,最少为 [log2n]+1
3. 一棵具有100个结点的完全二叉树,其叶结点的个数为 50
4. {5912132030}为叶结点的权值所构造的哈夫曼树的带权路径长度是 217
5. m个叶结点的哈夫曼树中,结点的总数是 2m-1
6. 若一棵完全二叉树的第4(根结点在第0)7个结点,则这棵完全二叉树的结点总数是 11
7. 在深度为k的完全二叉树中至少有 k个结点,至多有 2k-1 个结点。
8. 对一棵树转换成的二叉树进行先根遍历所得的遍历序列为ABCDEFGH,则对这棵树进行先根遍历所得的遍历序列为 ABCDEFGH
9. 二叉树常用的存储结构是 二叉链式存储结构 ,树常用的存储结构是 孩子兄弟链表存储结构
10. 对森林进行后根遍历操作等同于从左到右对森林中的每一棵树进行 后根 遍历操作,并且对森林的后根遍历序列与对森林所对应的二叉树的 中根 遍历序列相同。
四、算法设计题
1. 编写一个基于二叉树类的统计叶结点数目的成员函数。
参考答案:
    public int countLeafNode(BiTreeNode T) {// 统计叶结点数目
        int count = 0;
        if (T != null) {
            if (T.getLchild() == null && T.getRchild() == null) {
                ++count;// 叶结点数增1
            } else {
                count += Lchild()); // 加上左子树上叶结点数
                count += Rchild());// 加上右子树上的叶结点数
            }
        }
        return count;
    }
2. 编写一个基于二叉树类的查二叉树结点的成员函数。
参考答案:
    public BiTreeNode searchNode(BiTreeNode T,Object x) {
    // 在以T为根结点的二叉树中查值为x的结点,若到,则返回该结点,否则返回空值
          if (T != null) {
            if (T.getData().equals(x))
                return T;
            else {
                BiTreeNode lresult= Lchild(),x); // 在左子树上查
                return (lresult!=null?lresult:Rchild(),x)) ;
// 若左子树上没到,则到右子树上
            }
        }
        return null;   
    }
3. 编写算法求一棵二叉树的根结点root到一个指定结点p之间的路径并输出。
参考答案:
// 求根结点到指定结点的路径过程中,采用了后跟遍历的思想,最终求得的路径保存在一个链栈中,其中根结点处于栈顶位置,指定结点处于栈底位置。先序中序后序遍历二叉树
//下面用到的二叉树结点类BiTreeNode在书中第5章中已给出
public LinkStack getPath(BiTreeNode root, BiTreeNode p) {
        BiTreeNode T = root;
        LinkStack S = new LinkStack();// 构造链栈
        if (T != null) {
            S.push(T); // 根结点进栈
            Boolean flag;// 访问标记
            BiTreeNode q = null;// q指向刚被访问的结点
            while (!S.isEmpty()) {
                while (S.peek() != null)
                    // 将栈顶结点的所有左孩子结点入栈
                    S.push(((BiTreeNode) S.peek()).getLchild());
                S.pop(); // 空结点退栈
                while (!S.isEmpty()) {
                    T = (BiTreeNode) S.peek();// 查看栈顶元素
                    if (T.getRchild() == null || T.getRchild() == q) {
                        if (T.equals(p)) {
                            // 对栈S进行倒置,以保证根结点处于栈顶位置
                            LinkStack S2 = new LinkStack();
                            while (!S.isEmpty())
                                S2.push(S.pop());
                            return S2;
                        }
                        S.pop();// 移除栈顶元素
                        q = T;// q指向刚被访问的结点
                        flag = true;// 设置访问标记
                    } else {
                        S.Rchild());// 右孩子结点入栈
                        flag = false;// 设置未被访问标记
                    }
                    if (!flag)
                        break;
                }
            }
        }
        return null;
    }
4. 编写算法统计树(基于孩子兄弟链表存储结构)的叶子数目。
参考答案:
//下面用到的孩子兄弟链表结构中的结点类CSTreeNode在书中第5章中已给出
public int countLeafNode(CSTreeNode T) {
        int count = 0;
        if (T != null) {
            if (T.getFirstchild() == null)
              ++count;// 叶结点数增1
            else
              count += Firstchild()); // 加上孩子上叶结点数
              count += Nextsibling());// 加上兄弟上叶结点数
        }
        return count;
    }
5. 编写算法计算树(基于孩子兄弟链表存储结构)的深度。
参考答案:
public int treeDepth(CSTreeNode T) {
        if (T != null) {
            int h1= Firstchild());
            int h2= Nextsibling());
            return h1+1>h2?h1+1:h2;
        }
        return 0;
    }

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。