第五章 树和二叉树——课后习题解练【数据结构(c语言版 第2版)】

1.选择题

(1)

答案:A

(2)

(3)

同类型题目

(4) (5)(6)(7)

答案:CACC

(8)

真题再现

(9)(10)(11)

答案:DCB

(12)

(13)(14)(15)

答案:ACA

2.应用题

(1)

(2)

(3)

3.算法设计题

(1)

cpp 复制代码
int LeafNodeCount(BiTree T) {
    if (T == NULL)
        return 0; // 空树,叶子结点数为0
    else if (T->lchild == NULL && T->rchild == NULL)
        return 1; // 是叶子结点
    else
        return LeafNodeCount(T->lchild) + LeafNodeCount(T->rchild);
}

(2)

cpp 复制代码
int IsEqual(BiTree T1, BiTree T2) {
    if (T1 == NULL && T2 == NULL)
        return 1; // 都为空,相等
    if (T1 == NULL || T2 == NULL)
        return 0; // 一个为空一个非空,不相等
    if (T1->data != T2->data)
        return 0; // 结点值不同,不相等
    // 递归比较左右子树
    return IsEqual(T1->lchild, T2->lchild) && IsEqual(T1->rchild, T2->rchild);
}

(3)

cpp 复制代码
void ChangeLR(BiTree &T) {
    BiTree temp;
    if (T == NULL)
        return; // 空树直接返回
    if (T->lchild == NULL && T->rchild == NULL)
        return; // 叶子结点无需交换
    
    // 交换左右孩子
    temp = T->lchild;
    T->lchild = T->rchild;
    T->rchild = temp;
    
    // 递归处理左右子树
    ChangeLR(T->lchild);
    ChangeLR(T->rchild);
}

(4)

cpp 复制代码
// 双序遍历函数
void DoubleTraverse(BiTree T) {
    if (T == NULL) {
        return;                  // 空树,直接返回
    }
    
    if (T->lchild == NULL && T->rchild == NULL) {
        printf("%c ", T->data); // 叶子结点,只输出一次
    } else {
        printf("%c ", T->data); // 第一次访问根结点
        DoubleTraverse(T->lchild); // 双序遍历左子树
        printf("%c ", T->data); // 第二次访问根结点
        DoubleTraverse(T->rchild); // 双序遍历右子树
    }
}