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

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

                        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的结点总数。

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

//------------二叉树的链式存储的实现-----------//
#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
请按任意键继续. . .

  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值