首页 > 编程知识 正文

python二叉树层序遍历,二叉树层次遍历c语言

时间:2023-05-04 00:57:24 阅读:15168 作者:1979

层序遍历是指从上到下、从左到右的顺序遍历二叉树的元素。

实现二叉树层序遍历需要二叉树和队列。

总体思路:

确定当前队列是否为空队列:退出。 队列不空。 检索队列中的第一个元素,按顺序对检索到的元素的两个子节点进行排队,然后使用自定义initQ函数创建空队列。

然后,我们对二叉树的根节点(例如这里是3 )进行排队。 要进入这里,必须使用后缀法来满足队列的“先进先出”规则。

确定当前队列是否为空。 我们到了3号账,所以现在队列是【3】。 不是空的。 进入下一步。

提取头部的第一个元素(3),然后对3个子节点(9和20 )进行排队。 现在的队列是【9,20】

递归:确定队列是否为空。 因为有9和20,所以不是空的。 检索第一个元素9,并对9个子节点进行排队。 9的所有子节点都为NULL,因此当前队列为【20】

队列不是空的。 取出20,依次对20个子节点进行排队,队列为【15,7】

取出15,放在15个子节点上,队列为【7】

取出7,寄存在7的子节点上,队列清空后结束。

层序遍历结果: 3、9、20、15、7

3个结构体:

TreeNode (表示二叉树的节点。 其中有数据data,指向左右孩子的指针left和right; 队列节点:表示队列中的每个节点,并具有数据域data和指向下一个节点的指针next; 队列: front和rear表示某个队列,分别指队列的头和尾。 注意:队列包含空标头。5个函数:

initQ :创建队列是一个角色。 此队列中只有一个节点。 此节点上没有存储data。 那个下一个为空。 createTree :作用是做二叉树。

要递归创建二叉树,必须按照前面的步骤手动输入每个节点的元素。 如果节点没有左右子节点,则必须输入表示NULL的*。 enqueue :作用是提取二叉树的要素并进行排队。

此函数将新节点连接到以前创建的空队列中的上一个空节点之后。 请注意。 使用尾插法,新节点位于最后。 创建节点后,将二叉树的元素放入刚创建的节点中。 更新队列的rear,使rear始终指向队列的最后一个节点。

新节点按照“从右到左”的顺序与其他节点连接,首先将新节点的next (右边的项目)连接为NULL,然后将新节点的前驱next连接到新节点。 dequeue :删除队列的第一个节点是角色。

要对讨论进行分类,请根据队列中的节点数(initQ创建的空标头节点除外)进行分类

队列中的节点数大于1时:前端向右移动一个,释放队列中前端移动之前节点的内存;

如果队列中只有一个节点:将rear左移一个节点以释放内存。 LevelOrderBiTree :作用是层序输出。 调用前一个函数实现层序输出,函数思想是整个层序输出的思路,写在文章的前面。整体代码:

# include stdio.h # include stdlib.h # include malloc.h /层序遍历二叉树typedef struct TreeNode//树节点{struct TreeNode* left }TreeNode,* pTreeNode; 类型结构队列节点//队列节点{pTreeNode data; 队列节点*下一步; }队列节点,* pQueueNode; 类型结构队列//队列{pQueueNode front,rear; }队列,*队列; voidcreatetree(ptreenodet ) /预定义的t{char ch; canf_s('%c ',ch,sizeof ) ); 输入if(ch=='*'(/)则为空{t=NULL; }else{t=new TreeNode; t-data=ch; 创建树(叔左); //递归创建树(t-right ); }pqueueinitq(pqueuepq )/(头前端pqueuenode ) malloc (sizeof ) queuenode ) ) ); if(pq-front==null )//判断内存分配是否成功({printf '内存分配不成功!' ); }else{pq-front-next=NULL; //队列的front和rear的next初始化为空的pq-rear=pq-front; 返回pq; }voidenqueue(pqueuepq,pTreeNode t ) /提取二叉树数据并将其排队。{pQueueNode pNew=new QueueNode; pNew-data=t; //二叉树的数据存储在队列pNew-next=NULL中的pq-rear-next=pNew; //末尾插入法建立连接的pq-rear=pNew; //rear更新}ptreenodedequeue(pqueuepq )//出队:队列的第一个元素) pqueuenodeptemp=(pqueuenode ) malloc ) sizeof (队列节点) pTemp=pq-front-next; if (最大下一个==空)//只剩下一个节点(不包括队列空的第一个节点) {pq-rear=pq-front; }else{pq-front-next=pTemp-next; //front1(1(从指向第一个非空节点更改为指向第二个节点) }pTreeNode x; x=最大数据; //x是队列第一个元素的数据自由(ptemp ); 返回x; } voidlevelorderbitree (ptreenodet ) /层序输出(pqueuepq=) pqueue (malloc ) sizeof (queue ) ); pq=initq(pq; 枚举(pq,t ); //取出二叉树的根节点,子节点为队列while(pq-rear!=pq-front(/如果队列不为空(ptreenodex=dequeue ) pq ); 用于打印//x队列弹出元素的数据printf('%c”,x-data ); if(x-left!=空(enqueue ) pq,x-left ); //递归左节点(if(x-right!=空(enqueue ) pq,x-right ); //递归右节点}}}int main () {pTreeNode t; 请输入printf ("二叉树数据: " ); 创建树(t; printf (层序横移为以下: ); levelorderbitree(t; 返回0; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。