首页 > 其他分享 >利用递归的二叉树的先序,中序,后序遍历

利用递归的二叉树的先序,中序,后序遍历

时间:2024-07-16 20:27:44浏览次数:12  
标签:遍历 中序 bt 二叉树 printf 先序

一.常见的二叉树的遍历

①先序遍历:先访问根节点,再访问左右子树(根左右)

③中序遍历:先访问左子树,再访问根节点,最后访问右子树(左根右)

③后序遍历:先访问左右子树,再访问根节点(左右根)

先定义二叉树的数据结构:

typedef char ElemType;

typedef struct BTNode {
	ElemType data; 				//数据域
	struct BTNode* lchild;		//左孩子指针
	struct BTNode* rchild;		//右孩子指针
}BTNode,*BTree;

二.二叉树的遍历

1.先序遍历

算法的实现:

①先访问根节点

②再先序遍历左子树

③最后先序遍历右子树

代码的实现:

//先序遍历
void PreOrder(BTree bt)
{
	if (bt!= NULL)
	{
		printf("%c", bt->data);
		PreOrder(bt->lchild);
		PreOrder(bt->rchild);
	}
}

递归函数实际上隐式的利用了栈,虽然没有实际上显示出来,但是在二叉树的遍历中可以清晰地表现出来。

二叉树先序遍历的整体过程为:根节点入栈并访问,再遍历左子树,出栈遍历右子树。

用图示的方法来对先序遍历的递归算法进行解释:

在这里插入图片描述

先序遍历:ABDFGCEH

因此根据以上图解也能够写出先序遍历的非递归算法,就是利用栈来实现遍历,具体流程也是如上图。

2.中序遍历

算法的实现:

①先中序遍历左子树

②再访问根节点

③最后中序遍历右子树

代码的实现:

//中序遍历
void InOrder(BTree bt)
{
	if (bt != NULL)
	{
		InOrder(bt->lchild);
		printf("%c", bt->data);
		InOrder(bt->rchild);
	}
}

递归函数实际上隐式的利用了栈,虽然没有实际上显示出来,但是在二叉树的遍历中可以清晰地表现出来。

其中二叉树的先序遍历和中序遍历的思路是一致的,唯一的差距就是访问根节点的时间不同

二叉树中序遍历的整体过程为:根节点入栈遍历左子树,出栈访问根节点遍历右子树。

用图示的方法来对先序遍历的递归算法进行解释:

在这里插入图片描述

中序遍历:BFDGACEH

因此根据以上图解也能够写出中序遍历的非递归算法,就是利用栈来实现遍历,具体流程也是如上图。

3.后序遍历

算法的实现:

①先后序遍历左子树

②再后序遍历右子树

③最后访问根节点

代码的实现:

//后序遍历
void PostOrder(BTree bt)
{
	if (bt != NULL)
	{
		PostOrder(bt->lchild);
		PostOrder(bt->rchild);
		printf("%c", bt->data);
	}
}

递归函数实际上隐式的利用了栈,虽然没有实际上显示出来,但是在二叉树的遍历中可以清晰地表现出来。

其中二叉树的先序遍历和中序遍历的思路是一致的,唯一的差距就是访问根节点的时间不同而后序遍历就存在一些差异,在根节点出栈后还需要再次入栈,为的是实现根节点最后的访问。

二叉树后序遍历的整体过程为:根节点入栈遍历左子树,出栈遍历右子树,紧接着入栈准备最后出栈的访问。

用图示的方法来对先序遍历的递归算法进行解释:

在这里插入图片描述

后序遍历:FGDBHECA

因此根据以上图解也能够写出后序遍历的非递归算法,就是利用栈来实现遍历,具体流程也是如上图。

三.完整代码及结果

这里输入二叉树:AB.DF…G…C.E.H…(‘.’表示为空)

可等到遍历结果:

先序遍历:ABDFGCEH
中序遍历:BFDGACEH
后序遍历:FGDBHECA

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

typedef char ElemType;

typedef struct BTNode {
	ElemType data;
	struct BTNode* lchild;
	struct BTNode* rchild;
}BTNode,*BTree;

//创建二叉树
void CreateBTree(BTNode*& bt)
{
	ElemType data;
	scanf("%c", &data);
	//getchar();
	if (data == '.')
	{
		bt = NULL;
	}
	else
	{
		bt = (BTree)malloc(sizeof(BTNode));
		bt->data = data;
		CreateBTree(bt->lchild);
		CreateBTree(bt->rchild);
	}
}

//先序遍历
void PreOrder(BTree bt)
{
	if (bt!= NULL)
	{
		printf("%c", bt->data);
		PreOrder(bt->lchild);
		PreOrder(bt->rchild);
	}
}

//中序遍历
void InOrder(BTree bt)
{
	if (bt != NULL)
	{
		InOrder(bt->lchild);
		printf("%c", bt->data);
		InOrder(bt->rchild);
	}
}

//后序遍历
void PostOrder(BTree bt)
{
	if (bt != NULL)
	{
		PostOrder(bt->lchild);
		PostOrder(bt->rchild);
		printf("%c", bt->data);
	}
}

int main()
{
	BTNode* bt;
	
    printf("输入二叉树:\n");
	CreateBTree(bt);
	printf("先序遍历:\n");
	PreOrder(bt);
	printf("\n");

	printf("中序遍历:\n");
	InOrder(bt);
	printf("\n");

	printf("后序遍历:\n");
	PostOrder(bt);
	printf("\n");
	return 0;
}

在这里插入图片描述

标签:遍历,中序,bt,二叉树,printf,先序
From: https://blog.csdn.net/2303_80471954/article/details/140475811

相关文章

  • 代码随想录算法训练营第十四天 | 226.翻转二叉树、101. 对称二叉树、 104.二叉树的最
    226.翻转二叉树题目:.-力扣(LeetCode)思路:前序遍历代码:classSolution{public:TreeNode*invertTree(TreeNode*root){if(root!=NULL){swap(root->left,root->right);invertTree(root->left);invertTree(root->right);}......
  • 「代码随想录算法训练营」第十二天 | 二叉树 part2
    226.翻转二叉树题目链接:https://leetcode.cn/problems/invert-binary-tree/题目难度:简单文章讲解:https://programmercarl.com/0226.翻转二叉树.html视频讲解:https://www.bilibili.com/video/BV1sP4y1f7q7题目状态:通过个人思路:类似二叉树的层序遍历的变形,创建一个队列,先......
  • 咬文嚼图式的介绍二叉树、B树/B-树
    前言因为本人天资愚钝,所以总喜欢将抽象化的事务具象化表达。对于各类眼花缭乱的树,只需要认知到它们只是一种数据结构,类似数组,切片,列表,映射等这些耳熟能详的词汇。对于一个数据结构而言,无非就是增删改查而已,既然各类树也是数据结构,它们就不能逃离增删改查的桎梏。那么,为什么我们......
  • 数据结构(Java):力扣&牛客 二叉树面试OJ题
    目录1、题一:检查两棵树是否相同 1.1思路分析1.2代码2、题二:另一颗树的子树2.1思路分析 2.2代码3、题三:翻转二叉树3.1思路分析3.2代码4、题四:判断树是否对称4.1思路分析 4.2代码 5、题五:判断是否为平衡二叉树5.1思路分析5.1.1平衡二叉树概念5.1.......
  • Day 13 二叉树part01
    Day13二叉树part01二叉树的递归遍历这个用递归就好,现在写起来基本没问题二叉树的迭代遍历这个是重点,今天写的时候居然一次写出来了,多刷还是有用的。前中后三种遍历方式,其迭代版本的难度排序前<中<后。所以写的时候也是按这个顺序去做的。144.二叉树的前序遍历使用一......
  • 代码随想录算法训练营第十三天 | 144.二叉树的前序遍历、94、二叉树的中序遍历、145、
    144.二叉树的前序遍历题目:.-力扣(LeetCode)思路:有递归法和使用栈来模拟递归的迭代法。代码:1.递归/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;*TreeNode():val(0),left(nu......
  • Day11(二叉树) | 二叉树的递归遍历 二叉树的迭代遍历 二叉树的统一迭代法 二
    二叉树的递归遍历终于来到了递归!!!递归是进入动态规划的第一步,有部分的递归完全可以写成动态规划!这里可以移步到左程云的视频观看.递归的步骤:确定递归函数的参数和返回值:确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数,并且还要明确每次递归的返......
  • 矩阵优化 DP 以及全局平衡二叉树实现的动态 DP 学习笔记
    矩阵乘法求斐波那契数列的第\(n\)项,其中\(n\le10^{18}\),对数\(m\)取模。写出转移方程,\(f_i=f_{i-1}+f_{i-2}\),直接算是\(O(n)\)的,似乎没什么办法优化。定义大小分别为\(n\timesp\)和\(p\timesm\)的矩阵(分别为\(a\)和\(b\))相乘的结果(矩阵\(c\))是一个大小为\(......
  • 数据结构-二叉树
    引入图论中的树和现实生活中的树长得一样,只不过我们习惯于处理问题的时候把树根放到上方来考虑。这种数据结构看起来像是一个倒挂的树,因此得名。定义一个没有固定根结点的树称为无根树(unrootedtree)。无根树有几种等价的形式化定义:有n个结点,n-1条边的连通无向图无向无环......
  • 「代码随想录算法训练营」第十一天 | 二叉树 part1
    二叉树的基本知识链接:https://programmercarl.com/二叉树理论基础.html要点:深度优先遍历前序遍历(递归法,迭代法)中序遍历(递归法,迭代法)后序遍历(递归法,迭代法)广度优先遍历层次遍历(迭代法)由于栈就是递归的一种实现结构,因此前中后序遍历的逻辑可以借助栈使用递归的方式......