数据结构:二叉树的基本操作(用递归实现)

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

         本文将通过完成以下内容来展示二叉树的基本操作,代码解释标注全面而且清晰,代码书写也十分规范,适合初学者进行学习,本篇文章算是本人的一些学习记录分享,希望对有需要的小伙伴提供一些帮助~

本文的内容为:

用递归的方法实现以下算法:

1.以二叉链表表示二叉树,建立一棵二叉树(算法5.3);

2.输出二叉树的中序遍历结果(算法5.1);

3.输出二叉树的前序遍历结果(见讲稿);

4.输出二叉树的后序遍历结果(见讲稿);

5.计算二叉树的深度(算法5.5);

6.统计二叉树的结点个数(算法5.6);

7.统计二叉树的叶结点个数;

8.统计二叉树的度为1的结点个数;

代码如下所示:

1、源程序及主要算法说明
#include<iostream>
using namespace std;

//二叉树的二叉链表存储表示
typedef struct BiNode
{				
	char data;						//结点数据域
	struct BiNode *lchild,*rchild;	//左右孩子指针
}BiTNode,*BiTree;

//1. 以二叉链表表示二叉树,建立一棵二叉树(算法5.3);
void CreateBiTree(BiTree &T)
{	
//按先序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T
	char ch;
	cin>>ch;
	if(ch=='#')   T=NULL;  	//递归结束,建空树
	else{
   	 	T=new BiTNode;    T->data=ch; 	//生成根结点
		cout<<"请输入"<<T->data<<"的左孩子(没有左孩子输入#)";
    	CreateBiTree(T->lchild);  //递归创建左子树
   		cout<<"请输入"<<T->data<<"的右孩子(没有左孩子输入#)";
    	CreateBiTree(T->rchild); //递归创建右子树
  }																	
}									//CreateBiTree
//2.输出二叉树的中序遍历结果(算法5.1);					
void InOrderTraverse(BiTree T)
{  
 	if(T){   
     InOrderTraverse(T->lchild); 
     cout<<T->data;
     InOrderTraverse(T->rchild);}
}

//3.输出二叉树的前序遍历结果(见讲稿);
void PreOrderTraverse(BiTree T)
{
	if(T){     
     cout<<T->data; 
     PreOrderTraverse(T->lchild); 
     PreOrderTraverse(T->rchild);
} 
}
// 4.输出二叉树的后序遍历结果(见讲稿);
void PostOrderTraverse(BiTree T)
{
	if(T){
     PostOrderTraverse(T->lchild); 
     PostOrderTraverse(T->rchild); 
     cout<<T->data; 
} 
}

//5.计算二叉树的深度(算法5.5);
int Depth(BiTree T) {
{    int m,n;
	if(T == NULL ) return 0;        //如果是空树,深度为0,递归结束
	else 
	{	m=Depth(T->lchild);			//递归计算左子树的深度记为m
		n=Depth(T->rchild);			//递归计算右子树的深度记为n
		if(m>n) return(m+1);		//二叉树的深度为m 与n的较大者加1
		else return (n+1);
	}
}
}

//6.统计二叉树的结点个数(算法5.6);
int NodeCount(BiTree T){
 	if(T==NULL) return 0;  			// 如果是空树,则结点个数为0,递归结束
     	else return NodeCount(T->lchild)+ NodeCount(T->rchild) +1;
    	 //否则结点个数为左子树的结点个数+右子树的结点个数+1
} 

//7.统计二叉树的叶结点个数;
int LeafCount(BiTree T){
 	if(T==NULL) 	//如果是空树返回0
		return 0;
	if (T->lchild == NULL && T->rchild == NULL)
		return 1; //如果是叶子结点返回1
	else return LeafCount(T->lchild) + LeafCount(T->rchild);
}

//8.统计二叉树的度为1的结点个数;
//	n=n0+n1+n2; n2=n0-1; n1=n-n0-n2=n-n0-(n0-1)=n-2n0+1
int n1Count(BiTree T,int n,int n0){
	if(T==NULL) 	//如果是空树返回0
		return 0;
	
	int n1=0; 
	n1=n-2*n0+1;
	
	if (n1<0) 
		return 0;
		
	return n1;
}

int main()
{
	BiTree tree;
	cout<<"请输入建立二叉链表的序列:\n";
	cout<<"请输入根节点:";
	CreateBiTree(tree);
	
	cout<<"所建立的二叉链表先序序列:\n";
	PreOrderTraverse(tree);
	cout<<"\n";
	cout<<"所建立的二叉链表中序序列:\n";
	InOrderTraverse(tree);
	cout<<"\n";
	cout<<"所建立的二叉链表后序序列:\n";
	PostOrderTraverse(tree);
	cout<<"\n";
	
	int depth = Depth(tree);
	cout<<"所建立的二叉链表深度是:\n";
	cout << "depth = " << depth;
	cout<<"\n";
	
	cout<<"所建立的二叉链表结点个数是:\n";
	int nodeCount = NodeCount(tree);
	cout << "nodeCount(n) = " << nodeCount;
	cout<<"\n";
	
	cout<<"所建立的二叉链表叶结点个数是:\n";
	int leafCount = LeafCount(tree);
	cout << "leafCount(n0) = " << leafCount;
	cout<<"\n";
	
	cout<<"所建立的二叉链表度为1的结点个数是:\n";
	int n1 = n1Count(tree,nodeCount,leafCount);
	cout << "n1 = " <<n1 ;
	cout<<"\n";
	
	cout<<endl;
	return 0;
}


运行结果如下:

数据结构:二叉树的基本操作(用递归实现)

 结论与体会:

1通过本次操作我对于二叉树的定义有了更清晰深刻的认识;

2.对于遍历二叉树中的三种不同的遍历方法我也有了更深的认识,每个遍历方法的操作定义最明显的差异体现在访问根节点的顺序不同,先序遍历会在开头访问根节点,而中序遍历则会在中间,后序遍历则会在最后访问,只要改变程序中的输出语句的顺序,便可类似的实现三个遍历。

本篇文章的内容如上所示,希望能为大家学习提供帮助~喜欢可以点赞收藏~文章来源地址https://www.toymoban.com/news/detail-463382.html

到了这里,关于数据结构:二叉树的基本操作(用递归实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【数据结构】二叉树的存储与基本操作的实现

    二叉树的存储结构分为: 顺序存储 和类似于 链表的链式存储 这里博主讲一下链式存储 二叉树的链式存储是通过一个一个的节点引用起来的,常见的表示方式有 二叉和三叉 表示方式 二叉表示: 三叉表示: 这里博主主要讲解一下孩子表示法 在学习二叉树的基本操作前,需

    2024年02月04日
    浏览(47)
  • 数据结构实验报告,二叉树的基本操作(C语言)

    作者:命运之光 专栏:数据结构 实验六 二叉树的基本操作 实验环境:Visual C++或Dev C++ 实验目的: 1、掌握二叉树创建; 2、掌握二叉树的遍历及常用算法。 实验内容: 通过完全前序序列创建一棵二叉树,完成如下功能: 1)输出二叉树的前序遍历序列; 2)输出二叉树的中序遍

    2024年02月09日
    浏览(37)
  • 二叉树的基本操作-C语言实现-数据结构作业

    目录  (1)二叉树的创建; (2)二叉树的先序、中序和后序遍历输出; (3)输出二叉树的叶子节点和度为2的节点的数量; (4)输出二叉树的深度; (5)将二叉树所有节点的左右子树互换(左子树变右子树,右子树变左子树); (6)参考书上,二叉树按层次输出(一行输出一层); (7)删除二

    2024年02月04日
    浏览(48)
  • 数据结构和算法学习记录——初识二叉树(定义、五种基本形态、几种特殊的二叉树、二叉树的重要性质、初识基本操作函数)

    目录 二叉树的定义 二叉树具体的五种基本形态 1.空树 2.只有一个节点 3.有左子树,但右子树为空 4.有右子树,但左子树为空  5.左右两子树都不为空 特殊二叉树 斜二叉树 满二叉树  完全二叉树 二叉树的几个重要性质 初识二叉树的几个操作函数  二叉树T: 一个有穷的节点

    2024年02月03日
    浏览(61)
  • 【数据结构】二叉树的基本概念

    树是一种非线性的数据结构,它是由n(n=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的 子树不能有交集,就是不能有闭环.N个节点两个一条边,所以是N-1个边,父节点的概念在下面讲. 节点的度

    2024年02月08日
    浏览(44)
  • 【数据结构】_7.二叉树概念与基本操作

    目录 1.树形结构 1.1 树的概念 1.2 树的相关概念 1.3 树的表示 1.4 树在实际中的应用—表示文件系统的目录树结构 ​编辑​2.二叉树 2.1 概念 2.2 特殊二叉树  2.3 二叉树的性质 2.4 二叉树的存储结构 2.4.1 顺序存储结构(数组存储结构) 2.4.2 链式存储结构 2.5 二叉树的基本操作 2

    2024年02月12日
    浏览(39)
  • 爱上数据结构:二叉树的基本概念

    ​ ​ 🔥个人主页 : guoguoqiang. 🔥 专栏 : 数据结构 ​ 树是一种非线性的数据结构,它是由n(n=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 没有前驱节点的结点叫做根结点 在树中,子树不

    2024年04月14日
    浏览(47)
  • 【数据结构入门】-二叉树的基本概念

    个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【数据结构初阶(C实现)】 今天的内容可是一个大头,比以往学的内容上了一个档次。大家对于这块内容一定要好好学,不是很理解的地方一定要及时解决,要不然到

    2023年04月10日
    浏览(82)
  • 数据结构——二叉树的基本概念及顺序存储(堆)

    目录 一.前言 二.树概念及结构 2.1 树的概念 2.2 树的相关概念 2.3 树的表现 2.4 树在实际中的应用(表示文件系统的目录树结构) 三.二叉树的概念及结构 3.1 概念 3.2 特殊的二叉树 3.3 二叉树的性质 3.4 二叉树的存储结构 3.4.1 顺序存储 3.4.2 链式存储 四.二叉树顺序结构及实现

    2024年02月08日
    浏览(45)
  • 数据结构和算法学习记录——平衡二叉树(基本介绍、平衡因子、平衡二叉树的定义、平衡二叉树的高度)

    目录 基本介绍 平衡因子 平衡二叉树  平衡二叉树的高度  什么是平衡二叉树? 以一个例子来解释一下: 搜索树结点按不同的插入次序,将会导致不同的深度和平均查找长度ASL   在二叉搜索树中查找一个元素:  (a)要找到Jan,需要查找一次;要找到Feb,需要查找两次;

    2023年04月26日
    浏览(65)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包