二叉树的创建销毁和如何层序遍历

大家好!前面的二叉树的学习,我们都是先手动构建二叉树的,这篇就说一下如何真正的去构建一棵二叉树。而且,我还会说一下前面没有说的一种遍历方式:层序遍历。
在这里插入图片描述

如何层序遍历

我们要进行层序遍历,要借助一个数据结构——队列。
思路:
1.先把根入队列,借助队列先进先出的性质。
2.上一层节点出的时候,带下一层的节点进去。

下面,我举个例子:
在这里插入图片描述
首先,我将1放到队列中:
在这里插入图片描述
我们看队列不为空,我们将1取出来,然后把它的孩子2和4带进去。
在这里插入图片描述
我们看队列不为空,我们将2取出来,然后把它的孩子3带进去,NULL就不进去了。
在这里插入图片描述
我们看队列不为空,我们将4取出来,然后把它的孩子5和6带进去
在这里插入图片描述
队列不为空,我们将3取出来,它的孩子都是NULL,不进去
在这里插入图片描述
队列不为空,我们将5取出来,它的孩子都是NULL,不进去
在这里插入图片描述
队列不为空,我们将6取出来,它的孩子都是NULL,不进去
在这里插入图片描述
当队列为空就结束了。

代码如下:
在这里插入图片描述

在这里插入图片描述

判断二叉树是否是完全二叉树

我们知道完全二叉树前n-1层是满的,最后一层是连续的。
那我们该如何判断呢?用的就是上面层序遍历的思想。
解题思路:
1.层序遍历,NULL也进队列
2.遇到NULL以后,出队列中所有数据。如果全是NULL,就是完全二叉树,如果有非NULL,就不是。

就看上面举的例子:
在这里插入图片描述
在这里插入图片描述
你会发现,当遇到NULL时,后面还有5,6,那么就说明不是完全二叉树。

那么如果是这样的一个二叉树:
在这里插入图片描述
你就会发现当遇到NULL时,后面全是NULL:
在这里插入图片描述
这样,我们用代码来实现:
在这里插入图片描述

二叉树的创建

那么一个二叉树我们该如何真正的去创建呢?
我来举个例子:
在这里插入图片描述
假设,我们用前序遍历的方式来创建这个二叉树,#号代表NULL。
构建的二叉树应该是这个样子:
在这里插入图片描述
代码如下:

typedef struct BrinyTreeNode
{
    struct BrinyTreeNode* left;
    struct BrinyTreeNode* right;
    char data;
}BTNode;

BTNode* CreateTree(char* arr,int* pi)
{
    //当遇到NULL时,就返回
    if(arr[(*pi)]=='#')
    {
        (*pi)++;
        return NULL;
    }
	//如果不是NULL,就开辟节点的空间
    BTNode* root=(BTNode*)malloc(sizeof(BTNode));
    
    root->data=arr[(*pi)++];
 	//递归到左边右边,连接起来
    root->left=CreateTree(arr,pi);
    root->right=CreateTree(arr,pi);
    
    return root;
}

二叉树的销毁

二叉树的销毁只能是后序遍历,如果是前序和中序的话,那么根会先销毁,就找不到它的孩子了。

代码如下:

void BTreeDestory(BTNode* root)
{
	if (root == NULL)
	{
		return;
	}

	BTreeDestory(root->left);
	BTreeDestory(root->right);
	free(root);
}

如果大家觉得有帮助,希望能够多多支持!谢谢大家!
在这里插入图片描述

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
好的,我明白了,以下是对应问题的回答: 1、二叉树的建立: 二叉树的建立可以采用递归或非递归方式。递归方式比较简单,对于每个节点,先创建一个节点,然后递归地创建它的左右子树。非递归方式一般使用栈,先将根节点入栈,然后循环执行以下操作:取出栈顶节点,读入它的左右子树(如果有的话),并将它们入栈。直到栈为空为止。 2、前序遍历二叉树: 前序遍历二叉树的顺序是:先访问根节点,然后访问左子树,最后访问右子树。实现方式可以采用递归或非递归方式。 3、中序遍历二叉树: 中序遍历二叉树的顺序是:先访问左子树,然后访问根节点,最后访问右子树。实现方式可以采用递归或非递归方式。 4、后序遍历二叉树: 后序遍历二叉树的顺序是:先访问左子树,然后访问右子树,最后访问根节点。实现方式可以采用递归或非递归方式。 5、按层序遍历二叉树: 按层序遍历二叉树的顺序是:从上到下、从左到右依次访问所有节点。实现方式可以采用队列,先将根节点入队,然后循环执行以下操作:取出队头节点,访问它的左右子节点(如果有的话),并将它们入队。直到队列为空为止。 6、求二叉树的深度: 求二叉树的深度可以采用递归方式。对于每个节点,它的深度等于左右子树深度的较大值再加1。如果节点为空,则深度为0。 7、求指定结点到根的路径: 求指定结点到根的路径可以采用递归方式。对于每个节点,如果它是目标节点或者目标节点的祖先节点,则将它加入路径中。如果节点为空,则返回空路径。 8、二叉树销毁二叉树销毁可以采用递归方式。对于每个节点,先销毁它的左右子树,然后再销毁它本身。如果节点为空,则直接返回。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学代码的咸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值