层序遍历递归删除二叉树

层序遍历递归删除二叉树

什么是递归删除?

从叶节点开始向根节点的方向逐层删除。

直观的讲,对于以下二叉树,递归删除的次序为:f -> g -> h -> i -> d -> e -> b -> c -> a

在这里插入图片描述

递归删除一定要用递归算法吗?

不一定,你可以用递归算法实现递归删除,也可以用非递归算法实现递归删除;可以用非递归算法实现非递归删除,也可以用递归算法实现非递归删除。

简言之,递归删除的递归主要指的是删除的次序,而非删除算法是否递归。

非递归层序遍历实现递归删除

非递归层序需要队列辅助,进行递归删除需要栈的辅助。

二叉树链式存储结构描述:

typedef struct BiTNode{
    ElemType data;
    struct BiTNode* lchild, * rchild;
}BiTNode, * BiTree;

层序遍历递归删除二叉树的非递归实现(伪代码):

void LevelOrder(BiTree T){
    InitQueue(Q); // 初始化辅助队列
    InitStack(S); // 初始化辅助栈
    BiTree p;
    EnQueue(Q, T); // 根节点入队
    while(!EmptyQueue(Q)){
        DeQueue(Q, p); // 层序出队
        Push(S, p); // 层序入栈
        if(p->rchild != null) // 左子树不空则左孩子进栈
            EnQueue(Q, p->rchild);
        if(p->lchild != null) // 右子树不空则右孩子进栈
            EnQueue(Q, p->lchild);
    }
    while(!EmptyStack(Q)){ // 递归序删除
        Pop(S, p);
        free(p);
    }
}

递归层序遍历实现递归删除

我认为单纯的递归层序是无法实现递归删除的。纯递归层序无法传递兄弟树的信息,一定要借助某些辅助结构,例如:使用辅助栈或使用辅助指针。

使用辅助栈

二叉树链式存储结构描述同上,不再赘述。

层序遍历递归删除二叉树的使用辅助栈的递归实现(伪代码):

void LevelOrder(BiTree T, int level, DynamicArray A[]){
    if(T == null) return; // 递归退出条件
    if(level > A.length) // 如果是新的一层则为该层新增一个栈
        PushBack(InitStack(S));
    Push(A[level], T); // 入对应层的栈
    LevelOrder(T->rchild, level+1); // 递归处理右子树
    LevelOrder(T->lchild, level+1); // 递归处理左子树
}

void deleteBiTree(BiTree T){
    InitDynamicArray(A); // 初始化辅助动态数组
    LevelOrder(T, 1);
    for(int i = A.length - 1; i >= 0; i--){ // 递归序删除
        while(!EmptyStack(A[i])){
            Pop(S, p);
            free(p);
        }
    }
}

使用辅助指针

这个思路是为了解决无法跳转到层序后续节点的问题,给每个节点添加一个指针指向层序后续节点,此时二叉树链式存储结构描述:

typedef struct BiTNode{
    ElemType data;
    struct BiTNode* lchild, * rchild, * next;
}BiTNode, * BiTree;

直观的看是这样:

在这里插入图片描述

层序遍历递归删除二叉树的使用辅助指针的递归实现(伪代码):

void LevelOrder(BiTree T){
    if(T == null) return;
    LevelOrder(T->next);
    free(T);
}

不过这样有个小瑕疵,还是自下向上删除的,但每层的删除顺序是倒着的:i -> h -> g -> f -> e -> d -> c -> b -> a

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在C语言中层序构造二叉树,可以使用队列来辅助实现。首先,我们需要定义三个结构体:TreeNode表示二叉树的节点,QueueNode表示队列的每个节点,Queue表示一条队列。\[1\] 然后,我们需要实现五个函数来完成层序构造二叉树的过程。initQ函数用于创建一个队列,这个队列只有一个节点,这个节点没有存储数据,它的next指针为NULL。createTree函数用于递归地创建二叉树,需要按照前序方式手动输入每个节点的元素。如果某个节点没有左右子节点,需要输入*表示NULL。enqueue函数用于将二叉树的元素取出放入队列中。这个函数会在之前创建的空队列中新建一个节点,并将新节点放在队列的尾部。dequeue函数用于删除队列的第一个节点。根据队列中节点的数量进行分类讨论,当队列中节点数量大于1时,将front指针右移一位,并释放队列中front移动之前节点的内存;当队列只有1个节点时,将rear指针向左移动一位,并释放内存。LevelOrderBiTree函数用于层序输出二叉树的元素,通过调用前面的函数来实现层序输出的思路。\[2\] 因此,你可以按照上述步骤来实现C语言中的层序构造二叉树。 #### 引用[.reference_title] - *1* *2* [C语言 层序遍历二叉树递归)](https://blog.csdn.net/qq_39622152/article/details/112286488)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值