首页 > 其他分享 >二叉树链式结构的前序、中序、后序、层序遍历

二叉树链式结构的前序、中序、后序、层序遍历

时间:2024-06-01 17:32:47浏览次数:25  
标签:遍历 中序 层序 节点 BTNode 二叉树 root 前序

文章目录

一、二叉树创建

&mesp; 实现二叉树的遍历,我们要先手搓出一个二叉树,在次基础上实现二叉树的前序、中序、后序、层序遍历。


创建二叉树节点的结构体,包括该节点的值,以及该节点的左节点和右节点。

typedef int BTDataType;

typedef struct BinaryTreeNode
{
	BTDataType data;
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
}BTNode;

创建一个函数BinaryTreeCreate,在这个函数内手搓出一棵二叉树
//申请节点
BTNode* BuyNode(int x)
{
	BTNode* node = (BTNode*)malloc(sizeof(BTNode));
	if (node == NULL)
	{
		perror("malloc: BuyNode");
		return 0;
	}

	node->data = x;
	node->left = node->right = NULL;
}

//二叉树
BTNode* BinaryTreeCreate()
{
    //创建6个节点
	BTNode* node1 = BuyNode(1);
	BTNode* node2 = BuyNode(2);
	BTNode* node3 = BuyNode(3);
	BTNode* node4 = BuyNode(4);
	BTNode* node5 = BuyNode(5);
	BTNode* node6 = BuyNode(6);

	node1->left = node2;//1的左节点是2
	node1->right = node4;//1的右节点是4
	node2->left = node3;//2的左节点是3
	node4->left = node5;//4的左节点是5
	node4->right = node6;//4的右节点是6

	return node1;
}


下面是二叉树展示图
在这里插入图片描述
                      前序、中序、后序遍历均已递归方式来实现

二、前序遍历

概念以及解释

  前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点的操作发生在遍历其左右子树之前。
  前序遍历打印顺序为:根、左、右
在这里插入图片描述

代码

// 二叉树前序遍历 (根  左  右)
void  BinaryTreePrevOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("N ");//为空就打印 N
		return 0;
	}
		
	printf("%d ", root->data);//先打印根节点
	BinaryTreePrevOrder(root->left); //递归遍历左子树
	BinaryTreePrevOrder(root->right);//递归遍历右子树
}

三、中序遍历

概念及解释

  中序遍历(Inorder Traversal)——访问根结点的操作发生在遍历其左右子树之中(间)。
  中序遍历打印顺序为:左、根、右
在这里插入图片描述

代码

void BinaryTreeInOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("N ");
		return 0;
	}
	BinaryTreeInOrder(root->left);//递归遍历左子树
	printf("%d ", root->data);//打印根节点
	BinaryTreeInOrder(root->right);//递归遍历右子树
}

四、后序遍历

概念及解释

&rmsp;&emsp**;后序遍历**(Postorder Traversal)——访问根结点的操作发生在遍历其左右子树之后。
  后序遍历的顺序为左、右、根
在这里插入图片描述

代码

// 二叉树后序遍历
void BinaryTreePostOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("N ");
		return 0;
	}
	BinaryTreePostOrder(root->left);
	BinaryTreePostOrder(root->right);
	printf("%d ", root->data);
}

五、层序遍历

概念及解释

  层序遍历:除了先序遍历、中序遍历、后序遍历外,还可以对二叉树进行层序遍历。设二叉树的根结点所在层数为1,层序遍历就是从所在二叉树的根结点出发,首先访问第一层的树根结点,然后从左到右访问第2层上的结点,接着是第三层的结点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。


  层序遍历在图形上比前面三种遍历要清晰明了的多,但是在实现上就比较复杂了。他的实现需要用到队列的实现,队列的相关代码在前的博客中已经详细的介绍过了,所以这里我们直接运用。
队列的实现代码:队列的实现
在这里插入图片描述
在这里插入图片描述

代码

// 层序遍历
void BinaryTreeLevelOrder(BTNode* root)
{
	Queue q;
	QueueInit(&q);//初始化链表
	if (root != NULL)
	{
		QueuePush(&q, root);//插入链表
	}

	while (!QueueEmpty(&q))
	{
		BTNode* top = QueueFront(&q);//取头节点
		QueuePop(&q);//头节点出队列
		printf("%d ", top->data);

		if (top->left)
		{
			QueuePush(&q, top->left);//插入队列
		}
		if (top->right)
		{
			QueuePush(&q, top->right);//插入队列
		}
	}
	printf("\n");
	QueueDestory(&q);
	
}

标签:遍历,中序,层序,节点,BTNode,二叉树,root,前序
From: https://blog.csdn.net/2401_82669797/article/details/139373730

相关文章

  • 【数据结构】二叉树-堆(下)-链式二叉树
    个人主页~二叉树-堆(上)栈和队列二叉树四、堆的代码实现Heap.hHeap.ctest.c五、堆的应用堆排序思想进行排序六、二叉树链式结构的实现BTree.hBTree.ctest.c四、堆的代码实现Heap.h#pragmaonce#include<stdio.h>#include<stdlib.h>#include<assert.h>......
  • 【数据结构】二叉树
    【数据结构】二叉树树树的概念树的相关概念树的注意事项左孩子右兄弟表示法树实际中的应用二叉树二叉树的概念二叉树的注意事项特殊二叉树满二叉树完全二叉树二叉树的性质二叉树的存储形式顺序存储链式存储二叉树链式结构简单初始化二叉树的遍历前序遍历中序遍历后续......
  • 【LeetCode算法】第101题:对称二叉树
    目录一、题目描述二、初次解答三、官方解法四、总结一、题目描述二、初次解答1.思路:递归判定左子树和右子树是否对称。用一个新函数sym来递归判定左子树和右子树是否对称。该函数细节:判定当前传入的两个根节点是否为空,若均为空则返回true,若只有其中一个为空则返回fa......
  • 【二叉树】Leetcode 129. 求根节点到叶节点数字之和【中等】
    求根节点到叶节点数字之和给你一个二叉树的根节点root,树中每个节点都存放有一个0到9之间的数字。每条从根节点到叶节点的路径都代表一个数字:例如,从根节点到叶节点的路径1->2->3表示数字123。计算从根节点到叶节点生成的所有数字之和。叶节点是指没有......
  • [数据结构+二叉树+B-Tree和红黑树与B+Tree与hashMap原理+ concurrentHashMap的原理]析
    目录数据结构:你了解过哪些数据结构:这些数据结构的优缺点:二叉树:特点:二叉树适合做磁盘存储吗: 缺点:B-Tree:b-树的查找过程:思考:特点:B+Tree: B+树搜索过程与B树的查询过程没有区别。但实际上有三点不一样:(B+Tree优势)简述B+Tree:不经历IO的情况下,可以直接......
  • Leetcode 力扣106. 从中序与后序遍历序列构造二叉树 (抖音号:708231408)
    给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。示例1:输入:inorder=[9,3,15,20,7],postorder=[9,15,7,20,3]输出:[3,9,20,null,null,15,7]示例2:输入:inorder=[......
  • Leetcode 力扣105. 从前序与中序遍历序列构造二叉树 (抖音号:708231408)
    给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。示例1:输入:preorder=[3,9,20,15,7],inorder=[9,3,15,20,7]输出:[3,9,20,null,null,15,7]示例2:输入:preorder......
  • 3598. 二叉树遍历 已知前序 中序 求后序遍历
    #include<iostream>usingnamespacestd;voidpostOrder(stringpre,stringin)//定义后序遍历函数,参数为前序遍历和中序遍历结果字符串{if(in.size()){charroot=pre[0];//获取前序遍历结果的第一个字符作为根节点intk=in.find(......
  • 完全二叉树查找
    描述有一棵树,输出某一深度的所有节点,有则输出这些节点,无则输出EMPTY。该树是完全二叉树。输入描述输入有多组数据,遇到0时终止输入。每组输入一个n(1<=n<=1000),然后将树中的这n个节点依次输入,再输入一个d代表深度。输出描述输出该树中第d层得所有节点,节点间用空格隔开,最后......
  • 二叉树的创建与遍历(附有C++实现详细代码)
    一、引言在计算机科学中,二叉树是一种常见的数据结构,它的每个节点最多有两个子节点,通常称为左子节点和右子节点。二叉树的应用广泛,包括但不限于搜索算法、排序算法、存储结构等。本文将详细讨论二叉树的创建与遍历方法,并通过代码示例进行说明。二、二叉树的基本概念在介......