二叉树的前序、中序、后序和层序遍历

本文介绍了二叉树的四种遍历方法:前序、中序、后序和层序遍历,并提供了对应的递归实现。同时,详细阐述了如何使用队列实现二叉树的构建,通过层序遍历构建二叉树,使得代码简洁易懂。最后展示了如何通过输入字符构建二叉树并进行遍历。
摘要由CSDN通过智能技术生成

遍历代码最简单的是用递归

这里的str是一个字符,如果有其他的数据结构,用一个visit()函数来输入

void PreOrder(BiTree Tree)
{
	if (Tree != NULL)
	{
		putchar(Tree->str);
		PreOrder(Tree->Lchild);
		PreOrder(Tree->Rchild);
	}
}

void MidOrder(BiTree Tree)
{
	if (Tree != NULL)
	{
		MidOrder(Tree->Lchild);
		putchar(Tree->str);
		MidOrder(Tree->Rchild);
	}
}

void LaterOrder(BiTree Tree)
{
	if (Tree != NULL)
	{
		LaterOrder(Tree->Lchild);
		LaterOrder(Tree->Rchild);
		putchar(Tree->str);
	}
}

层序遍历

void LayerOrder(BiList L)
{
	while (L)
	{
		putchar(L->node->str);
		L = L->next;
	}

}

下面简单说一下二叉树的构建。

1、定义数据结构

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

typedef struct BiTNode {
	char str;
	struct BiTNode* Lchild;
	struct BiTNode* Rchild;
}BiNode, *BiTree;

typedef struct BiQueue {
	BiNode* node;
	struct BiQueue* next;
}BiQue,*BiList;

typedef定义的第一个是二叉树的基本定义,大家都知道;

第二个typedef是定义了一个队列,此处按照层序来插入新的结点,队列的特点是先进先出,比如新加结点abc,a出队,a作为根节点,b出队,判定a的左孩子是否为空,为空,b成为了a的左孩子;同理c出队,判定a的左孩子是否为空(否),再判断a的右孩子是否为空(是),c成为a的右孩子,就是把a的右孩子指针指向c。

这里构建好一个队列后,构建好二叉树层序遍历只用遍历队列就可以了,不用繁琐的代码。

2、二叉树的建立

int main(){
	BiTree Tree = NULL;			//二叉树
	BiTree T=NULL;				//二叉树的结点
	BiList newNode = NULL;		//指向二叉树的结点,转而进入队列中
	BiList front = NULL;		//队列头
	BiList rear = NULL;			//队列尾
	BiList s = NULL;			//队列的滑移指针,用于指定新的二叉树的结点的接入
	char str;
	
	while (scanf("%c", &str) != EOF)
	{
		if (str == '\n')
			break;
		T = (BiTree)calloc(1, sizeof(BiNode));
		T->str = str;
		newNode = (BiList)calloc(1, sizeof(BiQue));
		newNode->node = T;
		
		if (Tree == NULL)
		{
			Tree = T;
			front = newNode;
			rear = newNode;
			s = front;

			continue;
		}

		rear->next = newNode;
		rear = rear->next;

		if (s->node->Lchild == NULL)
			s->node->Lchild = T;
		else if (s->node->Rchild == NULL)
		{
			s->node->Rchild = T;
			s = s->next;
		}
	}

构建好二叉树,就可以进行遍历了。

	PreOrder(Tree);
	printf("\n");
	MidOrder(Tree);
	printf("\n");
	LaterOrder(Tree);
	printf("\n");

	LayerOrder(front);

	return 0;

front代表的是队列头部,传入队头,进行层序遍历。

今天就简单分享到这里~bye

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值