二叉树的层序创建

本代码是在看了王道c语言督学营的视频后写的。层序建树最主要的是利用了辅助队列,运用尾插法使树的节点先入队列。通过队列的头指针pcur读取并判断树结点的左右指针是否为空从而实现建树。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

#define len1 sizeof(BiTNode)
#define len2 sizeof(queue)
typedef char ElemType;//元素类型


typedef struct BiTNode {
	ElemType data;
	struct BiTNode* lchild, * rchild;//左右孩子指针
}BiTNode,*BiTree;

//辅助队列
typedef struct SqQueue {
	BiTree p;  //树的结点的指针
	struct SqQueue* pnext;
}SqQueue,*queue;


bool crateTree(BiTree& T)
{
	ElemType x;
	BiTree tree = NULL;//树根
	BiTree pnew=NULL;
	queue phead = NULL, ptail = NULL,listnew=NULL,pcur=NULL;
	while (scanf("%c", &x) != EOF)
	{
		if (x == '\n') {
			break;//输入换行结束
		}
		pnew = (BiTree)calloc(1, len1);//新的树的节点
		pnew->data = x;
		listnew = (queue)calloc(1, len2);
		listnew->p = pnew;//树的结点入列
		if (tree == NULL)
		{
			tree = pnew;
			phead = listnew;
			ptail = listnew;
			pcur = listnew;
			continue;
		}
		else
		{
			ptail->pnext = listnew;  //尾插法使listnew入列
			ptail = listnew;
		}

		if (pcur->p->lchild == NULL)
		{
			pcur->p->lchild = pnew;
		}
		else if (pcur->p->rchild == NULL)
		{
			pcur->p->rchild = pnew;
			pcur = pcur->pnext;
		}
		continue;//程序继续,直到读取换行时break掉整个循环。
		return true;
	}
	
	
}


int main()
{
	BiTree T;
	crateTree(T);

}

输入abcd换行即可建树成功:
在这里插入图片描述

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
二叉树层序遍历是指按照从上到下、从左到右的顺序访问二叉树的节点,并将节点按层级分组。对于给定的二叉树,我们可以使用队列来实现层序遍历。 以下是一个使用队列进行二叉树层序遍历的C++代码示例: ```c++ class Solution { public: vector<vector<int>> levelOrder(TreeNode* root) { vector<vector<int>> result; queue<TreeNode*> que; if (root != nullptr) { que.push(root); } while (!que.empty()) { vector<int> temp; int length = que.size(); for (int i = 0; i < length; i++) { TreeNode* tempNode = que.front(); que.pop(); temp.push_back(tempNode->val); if (tempNode->left) { que.push(tempNode->left); } if (tempNode->right) { que.push(tempNode->right); } } result.push_back(temp); } return result; } }; ``` 以上代码实现了一个名为`levelOrder`的函数,该函数接受一个二叉树的根节点作为参数,并返回一个二维向量,表示二叉树层序遍历结果。在函数内部,我们首先创建一个空的二维向量`result`用于存储结果,然后创建一个队列`que`用于辅助遍历。如果给定的二叉树不为空,我们将根节点入队。接下来,我们使用循环来遍历队列中的节点,并将节点的值存储到一个临时向量`temp`中。在遍历过程中,如果当前节点有左子节点,我们将左子节点入队;如果当前节点有右子节点,我们将右子节点入队。当遍历完一层后,我们将临时向量`temp`存储到结果向量`result`中,并继续下一层的遍历。最后,我们返回结果向量`result`。 希望以上解答对您有帮助!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [二叉树的层次遍历(C++)](https://blog.csdn.net/weixin_42817333/article/details/125110191)[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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值