数据结构与算法-二叉树的遍历

这篇具有很好参考价值的文章主要介绍了数据结构与算法-二叉树的遍历。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

数据结构与算法-二叉树的遍历,初阶数据结构与算法,数据结构,算法,c++,链表
🌞 “少年没有乌托邦,心向远方自明朗!”


🎈1.二叉树的遍历

二叉树的遍历是按照一定次序访问二叉树中的所有结点,且每个结点仅被访问一次的过程。遍历线性结构是容易解决的,而二叉树的结构是非线性结构,需要寻找规律,使二叉树的结点排列在一个线性队列上,便于遍历。

由二叉树的递归定义知,二叉树有根结点、左子树和右子树3个基本单元组成。如果以L、D、R分别表示遍历左子树、遍历根结点和遍历右子树,则遍历整个二叉树有DLR、LDR、LRD、DRL、RDL、RLD六种遍历方案。若规定先左后右,则只有DLR、LDR、LRD三种遍历方案,分别称为先序遍历、中序遍历和后序遍历
数据结构与算法-二叉树的遍历,初阶数据结构与算法,数据结构,算法,c++,链表

🔭1.1先序遍历

🔎先序遍历二叉树的过程如下:

  1. 访问根结点
  2. 先序遍历左子树
  3. 先序遍历右子树

✅ 如下图所示二叉树的先序序列为:ABJDGCEHF
数据结构与算法-二叉树的遍历,初阶数据结构与算法,数据结构,算法,c++,链表

🔭1.2中序遍历

🔎中序遍历二叉树的过程如下:

  1. 中序遍历左子树
  2. 访问根结点
  3. 中序遍历右子树

✅ 如下图所示二叉树的中序序列为:JBGDAEHCF
数据结构与算法-二叉树的遍历,初阶数据结构与算法,数据结构,算法,c++,链表

🔭1.3后序遍历

🔎后序遍历二叉树的过程如下:

  1. 后序遍历左子树
  2. 后序遍历右子树
  3. 访问根结点

✅ 如下图所示二叉树的后序序列为:JGDBHEFCA
数据结构与算法-二叉树的遍历,初阶数据结构与算法,数据结构,算法,c++,链表

🔭1.4层次遍历

🔎二叉树非空(设二叉树的高度为h时),层次遍历二叉树的过程如下:

  1. 先访问根结点(第1层)
  2. 再从左向右访问每层结点

✅ 如下图所示二叉树的层次序列为:ABCJDEFGH
数据结构与算法-二叉树的遍历,初阶数据结构与算法,数据结构,算法,c++,链表

🔭1.5二叉树遍历的递归算法

📝1.5.1先序遍历

void BiTree::InTraverse(BitNode* t)
{
	//先序遍历递归函数
	if (t)
	{
	    cout << data;
		InTraverse(t->lchild);
		InTraverse(t->rchild);
	}
}
void BiTree::InTraverseBiTree()
{
	BitNode* p = bt;
	InTraverse(p);
}

📝1.5.2中序遍历

void BiTree::InTraverse(BitNode* t)
{
	//中序遍历递归函数
	if (t)
	{
		InTraverse(t->lchild);
		cout << data;
		InTraverse(t->rchild);
	}
}
void BiTree::InTraverseBiTree()
{
	BitNode* p = bt;
	InTraverse(p);
}

📝1.5.3后序遍历

void BiTree::InTraverse(BitNode* t)
{
	//中序遍历递归函数
	if (t)
	{
		InTraverse(t->lchild);
		InTraverse(t->rchild);
		cout << data;
	}
}
void BiTree::InTraverseBiTree()
{
	BitNode* p = bt;
	InTraverse(p);
}

📝1.5.4例题一

已知二叉树采用二叉链表存储结构存储,设计一个交换二叉树左右子树的递归算法。
数据结构与算法-二叉树的遍历,初阶数据结构与算法,数据结构,算法,c++,链表

void ChangeSubTree(BitNode*& t)
{
	BitNode* temp;
	if (t)
	{
		temp = new BitNode;
		temp = t->lchild;
		t->lchild = t->rchild;
		t->rchild = temp;
		ChangeSubTree(t->lchild);
		ChangeSubTree(t->rchild);
	}
}

📝1.5.5例题二

已知二叉树采用二叉链表结构存储,请设计一个判断两棵二叉树是否相似的算法。若相似返回1,否则返回0.所谓两棵二叉树st相似是指st均为空的二叉树;或者st的根结点相似(值可以不同),且左右子树分别相似。
数据结构与算法-二叉树的遍历,初阶数据结构与算法,数据结构,算法,c++,链表

int Alike(BitNode* s, BitTree* t)
{
	if (s == NULL && t == NULL)
		return 1;
	else if (s == NULL || t == NULL)
		return 0;
	else
		return Alike(s->lchild, t->lchild) && Alike(s->rchild, t->rchild);
}

📝1.5.6例题三

已知二叉树采用二叉链表存储结构存储,设计一个将二叉树s拷贝给t的递归算法。
数据结构与算法-二叉树的遍历,初阶数据结构与算法,数据结构,算法,c++,链表

void CopyBitree(BitNode* s, BitNode*& t)
{
	if (s == NULL)
		t = NULL;
	else
	{
		t = new BitNode;
		t->data = s->data;
		CopyBiTree(s->lchild, t->lchild);
		CopyBiTree(s->rchild, t->rchild);
	}
}

🔭1.6二叉树遍历的非递归算法

为了把递归过程改成一个非递归过程,需要利用一个工作栈,记录遍历时的回退路径。

🔎先序遍历的算法流程:

  1. 用指针p指向当前需要处理的结点
  2. 访问该结点,该结点入栈,并将p指向左孩子,循环处理左子树
  3. 当该结点无左孩子时,表示栈顶结点无左子树,栈顶结点退栈,并将p指向刚出栈结点的右孩子
  4. 对右子树进行相同处理
  5. 重复上述过程,直到栈为空为止
void PreTraverse(BitNode* t)
{
	BitNode* p = t;
	SqStack s;
	while (p || !s.EmptyStack())
	{
		if (p)
		{//访问根结点,根结点指针入栈,遍历左子树
			cout << p->data;//访问结点
			s.Push(p);
			p = p->lchild;
		}
		else
		{//根结点退栈,遍历右子树
			s.Pop(p);
			p = p->rchild;
		}
	}
}

🔎中序遍历的算法流程:

  1. 用指针p指向当前需要处理的结点,p入栈
  2. 扫描该结点的左子树上的所有结点并将它们一一进栈
  3. 当该结点无左孩子时,表示栈顶结点无左子树,栈顶结点退栈,该问该结点,并将p指向刚出栈结点的右孩子
  4. 对右子树进行相同处理
  5. 重复上述过程,直到栈为空为止
void PreTraverse(BitNode* t)
{
	BitNode* p = t;
	SqStack s;
	while (p || !s.EmptyStack())
	{
		if (p)
		{//根结点入栈,遍历左子树
			s.Push(p);
			p = p->lchild;
		}
		else
		{//根结点退栈,访问结点,遍历右子树
			s.Pop(p);
			cout << p->data;//访问结点
			p = p->rchild;
		}
	}
}

🔎后序遍历的算法流程:

  1. 用指针p指向当前需要处理的结点,并置标志位flag=0(表示第一次入栈),p入栈
  2. 扫描该结点的左子树上的所有结点并将它们一一进栈
  3. 当该结点无左孩子时,表示栈顶结点无左子树,栈顶结点退栈,并判断标志位的值,若flag=0,置flag=1(表示该结点第二次入栈),该问该结点,并将p指向刚出栈结点的右孩子,若flag=1,则访问该结点,置p = NULL.
  4. 对右子树进行相同处理
  5. 重复上述过程,直到栈为空为止
typedef struct 
{
	BitNode* pointer;
	int flag;
}BitNodeFlag;
void PostTraverse(BitNode* t)
{
	BitNodeFlag bf;
	BitNode* p = t;
	SqStack s;
	while (p || !s.EmptyStack())
	{
		if (p)
		{
			bf.pointer = p;
			bf.flag = 0;
			s.Push(bf);
			p = p->lchild;
		}
		else
		{
			s.Pop(bf);
			if (bf.flag == 0)
			{
				bf.uflag = 1;
				s.Push(bf);
				p = p->rchild;
			}
			else
			{
				cout << bf.pointer->data;
				p = NULL;
			}
		}
	}
}

🔎层次遍历的算法流程:

层次遍历访问完某一层的结点后,再按照它们的访问次序对各结点的左、右子树顺序访问。如此一层一层地访问,先访问的结点其左、右孩子也要先访问。层次遍历过程可以用队列来实现。

void LevelTraverse(BitNode* t)
{
	BitNode* p = t;
	LinkQueue q;//初始化建立空队列
	if (p)
		q.Enqueue(p);//根结点入队
	while (!q.EmptyQueue())
	{
		q.DeQueue(p);//出队
		cout << p->data;//访问结点
		if (p->lchild)
			q.EnQueue(p->lchild);//左子树根结点入队
		if (p->rchild)
			q.EnQueue(p->rchild);//右子树根结点入队
	}
}

🔭1.7例题四

已知二叉树采用二叉链表存储结构存储,设计一个计算二叉树叶子结点的非递归算法。

int CountBitLeaf(BitNode* t)
{
	SqStack s;
	BitNode* p = t;
	int count = 0;
	while (p != NULL || !s.EmptyStack())
	{
		while (p != NULL)
		{
			s.Push(p);
			p = p->lchild;
		}
		if (!s.EmptyStack())
		{
			s.Pop(p);
			if (p->lchild == NULL && p->rchild == NULL)
				count++;
				p = p->rchild;
		}
	}
	return count;
}

好啦,关于二叉树的遍历的知识到这里就先结束啦,后期会继续更新学习数据结构与算法的相关知识,欢迎大家持续关注、点赞和评论!❤️❤️❤️文章来源地址https://www.toymoban.com/news/detail-719540.html

到了这里,关于数据结构与算法-二叉树的遍历的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 二叉树(下)+Leetcode每日一题——“数据结构与算法”“对称二叉树”“另一棵树的子树”“二叉树的前中后序遍历”

    各位CSDN的uu们你们好呀,今天小雅兰的内容仍然是二叉树和Leetcode每日一题,下面,就让我们进入二叉树的世界吧!!! 这个题目需要重新定义一个函数,函数参数需要有左子树和右子树,题目所给定的函数无法解决问题。 每个不为空的结点,都可以认为是一棵子树的根 

    2024年02月16日
    浏览(43)
  • 【算法与数据结构】二叉树的三种遍历代码实现(上)—— 用递归序知识点讲解

      本篇博客 (上篇) 先带大家学习 递归方式 进行三种遍历, 而在后续的 (下篇) 中将为大家详细讲解非递归的三种遍历方式。 目录 1、二叉树 2、二叉树的递归遍历 2.1、先序遍历 2.2、中序遍历 2.3、后序遍历  二叉树(Binary tree)是树形结构的一个重要类型。许多实际问

    2024年02月08日
    浏览(41)
  • 【数据结构与算法】二叉树的深度,节点数,第k层的节点数,遍历,二叉树叶节点的个数

        目录 一.前言 二.二叉树的节点数 二.二叉树的深度 三.二叉树第k层的节点数 四.二叉树的遍历 1.前序遍历 2.中序遍历 3.后序遍历 总结 4.层序遍历 五.二叉树叶节点的个数 我们需要 先构建个二叉树 ,方便后续对函数的测试; 还有我们在实现二叉树的这些函数时, 尽量少用

    2023年04月08日
    浏览(72)
  • 【数据结构】二叉树的遍历

      Yan-英杰的主页 悟已往之不谏 知来者之可追    C++程序员,2024届电子信息研究生 目录 前序、中序以及后序遍历 前序遍历 中序遍历 后序遍历                  学习二叉树结构,最简单的方式就是遍历。所谓 二叉树遍历 (Traversal) 是按照某种特定的规则,依次对二叉

    2023年04月23日
    浏览(42)
  • 数据结构 | 二叉树的各种遍历

    我们本章来实现二叉树的这些功能 Tree.h 我们先来几个简单的 直接手动个创建即可,很简单~~ 这里也是很简单,也可以看做下图这样遍历,或者画一下递归展开图 我们这里看一下递归展开图 为空就返回0 不是空,是叶子,返回1 不是空,也不是叶子,就递归左子树和右子树

    2024年02月04日
    浏览(38)
  • go数据结构(二叉树的遍历)

      用数组来存储二叉树如何遍历的呢? 如果父节点的数组下表是i,那么它的左孩子就是i * 2 + 1,右孩子就是 i * 2 + 2。  二叉树的遍历方式: 二叉树有 三种基本遍历方式 ,分别是 前序遍历、中序遍历和后序遍历 。遍历的原理是从根节点开始,按照特定方式递归遍历左子树

    2023年04月15日
    浏览(37)
  • 【数据结构】二叉树的层序遍历

    当我们面对一个树结构时,常常需要对其进行遍历以获取其中的节点信息。其中一种常用的遍历方式是层序遍历,也称为广度优先搜索(BFS)。本篇博客将详细介绍层序遍历的原理和实现方法。 层序遍历以树的根节点开始,按照从上到下、从左到右的顺序逐层遍历树中的节点

    2024年02月03日
    浏览(43)
  • 数据结构——二叉树的遍历与应用

    目录 一.前言 二. 二叉树链式结构的实现 2.1 前置说明 2.2 二叉树的遍历 2.2.1 前序、中序以及后序遍历 前序遍历: 中序遍历递归图: 后序遍历: 2.3节点个数 2.4叶子节点个数 2.5第K层的节点个数 2.6 二叉树查找值为x的节点 2.7 二叉树的销毁 三.结语   大家好久不见,放寒假了咱

    2024年01月19日
    浏览(46)
  • 【数据结构】二叉树的三种遍历

    目录 一、数据结构 二、二叉树 三、如何遍历二叉树 数据结构是计算机科学中用于组织和存储数据的方式。它定义了数据元素之间的关系以及对数据元素的操作。常见的数据结构包括数组、链表、栈、队列、树、图等。 数组是一种线性数据结构,它使用连续的内存空间存储

    2024年02月21日
    浏览(42)
  • Java数据结构——二叉树的遍历

     作者:敲代码の流川枫 博客主页:流川枫的博客 专栏:和我一起学java 语录:Stay hungry stay foolish 工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器——牛客网 点击注册和我一起刷题 文章目录 1.创建二叉树 2.二叉树的三种遍历方式 3.代码实现遍历 前序遍历

    2024年01月22日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包