二叉树的先序创建、复制、深度及结点个数


前言

  T_T此专栏用于记录数据结构及算法的(痛苦)学习历程,便于日后复习(这种事情不要啊)。所用教材为《数据结构 C语言版 第2版》严蔚敏。


一、二叉树的先序创建

  相关概念见专栏数据结构与算法,下面给出二叉树先序创建的代码实现:

#include<iostream>
using namespace std;

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


//按先序次序创建二叉树,创建二叉链表表示的二叉树T
void PreCreateBiTree(BiTree& T)
{
	char ch;
	cin >> ch;
	if (ch == '#')  T = NULL;			//递归结束,建空树
	else {
		T = new BTNode;
		T->data = ch;					//生成根结点
		PreCreateBiTree(T->lchild);	//递归创建左子树
		PreCreateBiTree(T->rchild);	//递归创建右子树
	}								
}									
								
//中序遍历二叉树						
void InOrderTraverse(BiTree T)
{
	if (T) {
		InOrderTraverse(T->lchild);
		cout << T->data;
		InOrderTraverse(T->rchild);
	}
}
void main()
{
	BiTree tree;
	cout << "请输入先序建立二叉链表的序列:\n";
	PreCreateBiTree(tree);
	cout << "所建立的二叉链表中序序列:\n";
	InOrderTraverse(tree);
	cout << endl;
}

在这里插入图片描述

在这里插入图片描述

二、二叉树的复制

  复制二叉树就是利用已有的一棵二叉树复制得到另外一棵与其完全相同的二叉树。下面给出二叉树的复制的代码实现:

#include<iostream>
using namespace std;

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

//按先序次序创建二叉树,创建二叉链表表示的二叉树T
void PreCreateBiTree(BiTree& T)
{
	char ch;
	cin >> ch;
	if (ch == '#')  T = NULL;			//递归结束,建空树
	else {
		T = new BTNode;
		T->data = ch;					//生成根结点
		PreCreateBiTree(T->lchild);	//递归创建左子树
		PreCreateBiTree(T->rchild);	//递归创建右子树
	}								
}									
//复制树
void Copy(BiTree T, BiTree& NewT)
{
	if (T == NULL)
	{   							//如果是空树,递归结束
		NewT = NULL;
		return;
	}
	else
	{
		NewT = new BTNode;
		NewT->data = T->data;					//复制根结点
		Copy(T->lchild, NewT->lchild);    		//递归复制左子树
		Copy(T->rchild, NewT->rchild);   		//递归复制右子树
	}											
}												

//中序遍历二叉树						
void InOrderTraverse(BiTree T)
{
	if (T) {
		InOrderTraverse(T->lchild);
		cout << T->data;
		InOrderTraverse(T->rchild);
	}
}
void main()
{
	BiTree tree, new_tree;
	cout << "请输入建立二叉树的序列:\n";
	PreCreateBiTree(tree);
	cout << "所建立的二叉链表中序序列:\n";
	InOrderTraverse(tree);
	cout << endl;
	Copy(tree, new_tree);
	cout << "复制得到的新树的中序序列:\n";
	InOrderTraverse(new_tree);
	cout << endl;
}

在这里插入图片描述

三、二叉树的深度

  二叉树的深度为树中结点的最大层次,下面给出其代码实现:

#include<iostream>
using namespace std;

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

//按先序次序创建二叉树,创建二叉链表表示的二叉树T
void PreCreateBiTree(BiTree& T)
{
	char ch;
	cin >> ch;
	if (ch == '#')  T = NULL;			//递归结束,建空树
	else {
		T = new BTNode;
		T->data = ch;					//生成根结点
		PreCreateBiTree(T->lchild);	//递归创建左子树
		PreCreateBiTree(T->rchild);	//递归创建右子树
	}								
}																			
//得到树的深度
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);
	}
}

void main()
{
	BiTree tree;
	cout << "请输入建立二叉链表的序列:\n";
	PreCreateBiTree(tree);
	cout << endl;
	cout << "树的深度为:" << Depth(tree) << endl;
}

在这里插入图片描述

四、二叉树的结点个数

  有时我们需要找到树的结点个数,如下图有七个结点。
在这里插入图片描述
  下面给出代码实现:

#include<iostream>
using namespace std;

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

//按先序次序创建二叉树,创建二叉链表表示的二叉树T
void PreCreateBiTree(BiTree& T)
{
	char ch;
	cin >> ch;
	if (ch == '#')  T = NULL;			//递归结束,建空树
	else {
		T = new BTNode;
		T->data = ch;					//生成根结点
		PreCreateBiTree(T->lchild);	//递归创建左子树
		PreCreateBiTree(T->rchild);	//递归创建右子树
	}								
}									
//得到树的结点数
int NodeCount(BiTree T)
{
	if (T == NULL) return 0;  			// 如果是空树,则结点个数为0,递归结束
	else return NodeCount(T->lchild) + NodeCount(T->rchild) + 1;
	//否则结点个数为左子树的结点个数+右子树的结点个数+1
}
void main()
{
	BiTree tree;
	cout << "请输入建立二叉链表的序列:\n";
	PreCreateBiTree(tree);
	cout << "结点个数为:" << NodeCount(tree) << endl;
}

在这里插入图片描述


总结

  路漫漫其修远兮,吾将上下而摆烂。(因为准备其他比赛断学了好久5555)
  有任何疑问和补充,欢迎交流。(但我显然不会T_T)

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值