数据结构——二叉树的链式存储的实现

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

第五章、二叉树的链式存储的实现和基本操作

                        InitBiTree(BiTree T)——初始化二叉树。

                        CreateBiTree(BiTree &T)——先序遍历的顺序建立二叉链表。

                        PreOrderTraverse(BiTree T)——先序遍历。

                        InOrderTraverse(BiTree T)——中序遍历。

                        PostOrderTraverse(BiTree T)——后序遍历。

                        Copy(BiTree T,BiTree &NewT)——复制二叉树。

                        Depth(BiTree T)——计算二叉树的深度。

                        NodeCount(BiTree T)——统计二叉树中结点的个数。

                        NodeCount1(BiTree T)——二叉树T中度为1的结点总数。

                        NodeCount2(BiTree T)——二叉树T中度为2的结点总数。文章来源地址https://www.toymoban.com/news/detail-756614.html

二叉树的链式存储的实现代码

//------------二叉树的链式存储的实现-----------//
#include<stdio.h>
#include<iostream>
#include<string>
using namespace std;
//------二叉树的二叉链表存储表示------//
typedef struct BiTNode
{
	char data;//结点数据域 
	struct BiTNode *lchild,*rchild;//左右孩子指针 
}BiTNode,*BiTree;

//初始化二叉树
void InitBiTree(BiTree T)
{
	T=new BiTNode;
	T==NULL;	
} 

//先序遍历的顺序建立二叉链表
void CreateBiTree(BiTree &T)
{
//按先序次序输入二叉树中的结点的值(一个字符),创建二叉链表表示的二叉树T
	char ch;
	cin>>ch;
	if(ch=='#') T=NULL;//递归结束,建空树 
	else	//递归创建二叉树 
	{
		T=new BiTNode;//生成根结点 
		T->data=ch;
		CreateBiTree(T->lchild);//递归创建左子树 
		CreateBiTree(T->rchild);//递归创建右子树 
	} 
}

//先序遍历
void PreOrderTraverse(BiTree T)
{
	if(T)
	{
		cout<<T->data;//访问根结点 
		PreOrderTraverse(T->lchild);//先序遍历左子树 
		PreOrderTraverse(T->rchild);//先序遍历右子树 
	}
} 

//中序遍历
void InOrderTraverse(BiTree T)
{
	if(T)
	{
		InOrderTraverse(T->lchild);//中序遍历左子树 
		cout<<T->data;//访问根结点 
		InOrderTraverse(T->rchild);//中序遍历右子树 
	}
} 

//后序遍历
void PostOrderTraverse(BiTree T)
{
	if(T)
	{
		cout<<T->data;
		PostOrderTraverse(T->lchild);
		PostOrderTraverse(T->rchild);
	}
} 

//复制二叉树
void Copy(BiTree T,BiTree &NewT)
{
	//复制一棵和T完全相同的二叉树
	if(T==NULL)//如果是空树,递归结束 
	{
		NewT=NULL;
		return;
	}
	else
	{
		NewT=new BiTNode;
		NewT->data=T->data;//复制根结点 
		Copy(T->lchild,NewT->lchild);//递归复制左子树 
		Copy(T->rchild,NewT->rchild);//递归复制右子树 
	 } 
} 

//计算二叉树的深度
int Depth(BiTree T)
{
	if(T==NULL) return 0;
	else
	{
		int m=Depth(T->lchild);
		int n=Depth(T->rchild);
		if(m>n) 
			return m+1;
		else
			return n+1;	
	}
} 

//统计二叉树中结点的个数
int NodeCount(BiTree T)
{
	if(T==NULL) 
		return 0;
	else
		return NodeCount(T->lchild)+NodeCount(T->rchild)+1;	 
}

//求二叉树T中度为1的结点总数
int NodeCount1(BiTree T)
{
	if (T == NULL) 
	{
		return 0;
	}
	else if ((T->lchild == NULL) && (T->rchild == NULL))
	{
		return 0;
	}
	else if(T->lchild == NULL) 
	{
		return 1+ NodeCount1(T->rchild);
	}
	else if (T->rchild == NULL) 
	{
		return 1 + NodeCount1(T->lchild);
	}
	else 
		return NodeCount1(T->lchild)+ NodeCount1(T->rchild);
}

//求二叉树T中度为2的结点总数
int NodeCount2(BiTree T)
{
	if (T == NULL) 
	{
		return 0;
	}
	else if ((T->lchild == NULL) && (T->rchild == NULL)) 
	{
		return 0;
	}
	else if (T->lchild == NULL) 
	{
		return  NodeCount2(T->rchild);
	}
	else if (T->rchild == NULL) 
	{
		return  NodeCount2(T->lchild);
	}
	else if ((T->lchild != NULL) && (T->rchild != NULL)) 
	{
		return 1+ NodeCount2(T->lchild) + NodeCount2(T->rchild);
	}
}


void Menu()
{
	printf("*************************************\n");
	printf("1.二叉树的初始化\n");
	printf("2.建立二叉树\n");
	printf("3.中序遍历\n");
	printf("4.后序遍历\n");
	printf("5.复制二叉树\n");
	printf("6.二叉树的深度\n");
	printf("7.二叉树中结点的个数\n");
	printf("8.二叉树T中度为1的结点总数\n");
	printf("9.二叉树T中度为2的结点总数\n");
	printf("10.退出程序\n"); 
	printf("*************************************\n");
}
  
int main()
{
	int choice;
	BiTree T,NewT;
	char ch;
	while(1)
	{
		Menu();
		printf("请输入要执行的操作:");
		scanf("%d",&choice);
		switch(choice)
		{
			case 1:
				InitBiTree(T);
				printf("二叉树T初始化成功!\n"); 
				break;
			case 2:
				printf("请输入要创建的二叉树,按先序序列输入,空树用字符'#'代替:"); 
				CreateBiTree(T);
				printf("二叉树T创建成功!\n");
				printf("此时前序遍历二叉树为:");
				PreOrderTraverse(T);
				printf("\n");
				break;
			case 3:
				printf("中序遍历二叉树为:");
				InOrderTraverse(T);
				printf("\n");
				break;
			case 4:
				printf("后序遍历二叉树为:");
				PostOrderTraverse(T);
				printf("\n");
				break;
			case 5:
				printf("复制后的二叉树为(先序遍历):");
				Copy(T,NewT);
				PreOrderTraverse(T);
				printf("\n");
				break;
			case 6:
				Depth(T);
				printf("二叉树T的深度为:%d\n",Depth(T));
				break;
			case 7:
				NodeCount(T);
				printf("二叉树中结点的个数为:%d\n",NodeCount(T));
				break;
			case 8:
				NodeCount1(T);
				printf("二叉树T中度为1的结点总数为:%d\n",NodeCount1(T));
				break;
			case 9:
				NodeCount2(T);
				printf("二叉树T中度为2的结点总数为:%d\n",NodeCount2(T));
				break;
			case 10:
				printf("退出程序!");
				exit(0);
				break;
			default:
				printf("输入错误!");
				break;			 
		}	
	}	
} 

运行结果

*************************************
1.二叉树的初始化
2.建立二叉树
3.中序遍历
4.后序遍历
5.复制二叉树
6.二叉树的深度
7.二叉树中结点的个数
8.二叉树T中度为1的结点总数
9.二叉树T中度为2的结点总数
10.退出程序
*************************************
请输入要执行的操作:1
二叉树T初始化成功!
*************************************
1.二叉树的初始化
2.建立二叉树
3.中序遍历
4.后序遍历
5.复制二叉树
6.二叉树的深度
7.二叉树中结点的个数
8.二叉树T中度为1的结点总数
9.二叉树T中度为2的结点总数
10.退出程序
*************************************
请输入要执行的操作:2
请输入要创建的二叉树,按先序序列输入,空树用字符'#'代替:ABC##DE#G##F###
二叉树T创建成功!
此时前序遍历二叉树为:ABCDEGF
*************************************
1.二叉树的初始化
2.建立二叉树
3.中序遍历
4.后序遍历
5.复制二叉树
6.二叉树的深度
7.二叉树中结点的个数
8.二叉树T中度为1的结点总数
9.二叉树T中度为2的结点总数
10.退出程序
*************************************
请输入要执行的操作:3
中序遍历二叉树为:CBEGDFA
*************************************
1.二叉树的初始化
2.建立二叉树
3.中序遍历
4.后序遍历
5.复制二叉树
6.二叉树的深度
7.二叉树中结点的个数
8.二叉树T中度为1的结点总数
9.二叉树T中度为2的结点总数
10.退出程序
*************************************
请输入要执行的操作:4
后序遍历二叉树为:ABCDEGF
*************************************
1.二叉树的初始化
2.建立二叉树
3.中序遍历
4.后序遍历
5.复制二叉树
6.二叉树的深度
7.二叉树中结点的个数
8.二叉树T中度为1的结点总数
9.二叉树T中度为2的结点总数
10.退出程序
*************************************
请输入要执行的操作:5
复制后的二叉树为(先序遍历):ABCDEGF
*************************************
1.二叉树的初始化
2.建立二叉树
3.中序遍历
4.后序遍历
5.复制二叉树
6.二叉树的深度
7.二叉树中结点的个数
8.二叉树T中度为1的结点总数
9.二叉树T中度为2的结点总数
10.退出程序
*************************************
请输入要执行的操作:6
二叉树T的深度为:5
*************************************
1.二叉树的初始化
2.建立二叉树
3.中序遍历
4.后序遍历
5.复制二叉树
6.二叉树的深度
7.二叉树中结点的个数
8.二叉树T中度为1的结点总数
9.二叉树T中度为2的结点总数
10.退出程序
*************************************
请输入要执行的操作:7
二叉树中结点的个数为:7
*************************************
1.二叉树的初始化
2.建立二叉树
3.中序遍历
4.后序遍历
5.复制二叉树
6.二叉树的深度
7.二叉树中结点的个数
8.二叉树T中度为1的结点总数
9.二叉树T中度为2的结点总数
10.退出程序
*************************************
请输入要执行的操作:8
二叉树T中度为1的结点总数为:2
*************************************
1.二叉树的初始化
2.建立二叉树
3.中序遍历
4.后序遍历
5.复制二叉树
6.二叉树的深度
7.二叉树中结点的个数
8.二叉树T中度为1的结点总数
9.二叉树T中度为2的结点总数
10.退出程序
*************************************
请输入要执行的操作:9
二叉树T中度为2的结点总数为:2
*************************************
1.二叉树的初始化
2.建立二叉树
3.中序遍历
4.后序遍历
5.复制二叉树
6.二叉树的深度
7.二叉树中结点的个数
8.二叉树T中度为1的结点总数
9.二叉树T中度为2的结点总数
10.退出程序
*************************************
请输入要执行的操作:10
退出程序!
--------------------------------
Process exited after 46.03 seconds with return value 0
请按任意键继续. . .

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

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

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

相关文章

  • 数据结构——二叉树的链式结构

      个人主页 : 日刷百题 系列专栏 : 〖C语言小游戏〗〖Linux〗〖数据结构〗  〖C语言〗 🌎 欢迎各位 → 点赞 👍+ 收藏 ⭐️+ 留言 📝  ​ 这里我们使用先序遍历的思想来创建二叉树,这里的内容对于刚接触二叉树的朋友可能有些难理解,不妨先看完下面的二叉树各种遍历

    2024年02月05日
    浏览(30)
  • 【数据结构】二叉树的链式结构

    学习链式二叉树要知道三种遍历方式,便于对二叉树的节点以及左子树和右子树进行操作。 前序遍历:根、左子树、右子树 中序遍历:左子树、根、右子树 后序遍历:左子树、右子树、根 以下图为例: 得到的结果: 前序遍历:1 2 3 4 5 6 中序遍历:3 2 1 5 4 6 后序遍历:3 2

    2024年02月08日
    浏览(27)
  • 数据结构:二叉树的链式结构

    朋友们、伙计们,我们又见面了,本期来给大家解读一下链式二叉树的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! 数据结构与算法专栏 :数据结构与算法 个  人  主  页 :stackY、 C 语 言 专 栏 :C语言:从入门到精通 目录 前言

    2024年02月07日
    浏览(39)
  • 【数据结构 —— 二叉树的链式结构实现】

    树是一种非线性的数据结构,它是由n(n=0)个有限结点组成一个具有层次关系的集合。 把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 1.有一个 特殊的结点,称为根结点 ,根节点没有前驱结点 2.除根节点外, 其余结点被分成M(M0)个互不相交

    2024年02月05日
    浏览(29)
  • 【数据结构—二叉树的链式结构实现】

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、二叉树的存储结构 二、二叉树链式结构的实现 2.1手动构建一课树 2.2二叉树的遍历 三、二叉树链式结构的实现 3.1前序遍历(递归) 3.2中序遍历(递归) 3.3后序遍历(递归) 3.4层序遍历(非递

    2024年02月03日
    浏览(35)
  • 数据结构初阶--二叉树的链式结构

    目录 一.二叉树链式结构的概念 二.二叉树链式结构的功能实现 2.1.链式二叉树的定义 2.2.链式二叉树的构建 2.3.链式二叉树的遍历 2.3.1.先序遍历 2.3.2.中序遍历 2.3.3.后序遍历 2.3.4.层序遍历 2.4.链式二叉树的求二叉树的结点数量 法一:计数法 法二:分治法 2.5.链式二叉树的求二

    2024年02月12日
    浏览(23)
  • 数据结构:二叉树的链式结构的实现

      目录  1.通过前序遍历构建二叉树 2. 二叉树的销毁  3.二叉树的遍历 4. 二叉树的节点个位和二叉树的叶子节点个位数 5. 二叉树的的k层节点数和查找值为x的节点 6. 判断二叉树是否为完全二叉树和求二叉树的高度h 二叉树的前序遍历 二叉树的中序遍历 二叉树的后序遍历

    2024年02月12日
    浏览(21)
  • 【数据结构】二叉树的链式结构及实现

    目录 1. 前置说明 2. 二叉树的遍历 2.1 前序、中序以及后序遍历 2.2 层序遍历 3. 节点个数及高度等 4. 二叉树的创建和销毁 在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。由于现在大家对二叉树结构掌握还不够深入,为了降低大家学习成

    2024年02月08日
    浏览(21)
  • 【数据结构】二叉树的链式结构的实现 -- 详解

    在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。为了降低大家学习成本,此处手动快速创建一棵简单的二叉树,快速进入二叉树操作学习。 注意 :上述代码并不是创建二叉树的方式。 学习二叉树结构,最简单的方式就是遍历。所谓

    2024年02月12日
    浏览(19)
  • 【数据结构】二叉树的链式实现及遍历

    后文所有代码中的二叉树结点: 前,中,后序遍历都可以采用分治递归的思想解决,将根节点和它的孩子结点分别处理。 此处仅利用递归展开图分析前序遍历,中序和后序也是相同的思想: 层序遍历需要利用队列来进行,如果二叉树跟结点不为空,则让 指向它的一个指针入

    2024年02月07日
    浏览(30)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包