跳到主要内容

简述举列二叉树的深度(递归;非递归) ?

参考答案:

二叉树的深度是指从根节点到最远叶子节点的最长路径上的节点数。计算二叉树的深度可以采用递归和非递归两种方式。

递归方式:

递归方式的思想是,如果二叉树为空,则深度为0;否则,二叉树的深度等于其左子树和右子树中深度较大的那个值加1。递归方式的代码实现可以参考以下C语言代码:

int depth(BiTree T) {
    if (T == NULL)
        return 0;
    else {
        int m = depth(T->lchild);
        int n = depth(T->rchild);
        if (m > n)
            return m + 1;
        else
            return n + 1;
    }
}

其中,BiTree是二叉树节点的结构体类型,lchild和rchild分别表示左子树和右子树。

非递归方式:

非递归方式的思想是使用一个栈来保存待处理的节点,从根节点开始,先将根节点入栈,然后不断从栈中弹出节点并计算其左右子树的深度,将左右子树中深度较大的那个值加1作为当前节点的深度,并将左右子树中非空的节点入栈。直到栈为空时,计算过程结束,栈中弹出的最后一个节点的深度即为二叉树的深度。非递归方式的代码实现可以参考以下C语言代码:

int depth(BiTree T) {
    if (T == NULL)
        return 0;

    int max_depth = 0;
    BiTree stack[MAX_SIZE]; // 假设栈的最大容量为MAX_SIZE
    int top = -1; // 栈顶指针

    stack[++top] = T; // 将根节点入栈

    while (top >= 0) { // 栈不为空时继续计算
        BiTree p = stack[top--]; // 弹出栈顶节点
        int left_depth = 0, right_depth = 0;

        if (p->lchild != NULL) { // 左子树非空
            stack[++top] = p->lchild; // 左子树入栈
            left_depth = depth(p->lchild); // 递归计算左子树的深度
        }

        if (p->rchild != NULL) { // 右子树非空
            stack[++top] = p->rchild; // 右子树入栈
            right_depth = depth(p->rchild); // 递归计算右子树的深度
        }

        max_depth = (left_depth > right_depth) ? (left_depth + 1) : (right_depth + 1); // 更新最大深度
    }

    return max_depth;
}

以上代码实现中,使用了一个数组stack来模拟栈,MAX_SIZE是栈的最大容量。在计算过程中,首先将根节点入栈,然后不断从栈中弹出节点并计算其左右子树的深度,将左右子树中非空的节点入栈。直到栈为空时,计算过程结束,栈中弹出的最后一个节点的深度即为二叉树的深度。