【SWUST-数据结构】二叉树-笔记

目录

前言

定义二叉树

二叉树的创建

二叉树的遍历

1.基于先序遍历建立输出二叉树的先序遍历序列

2.基于先序遍历建立输出二叉树的中序遍历序列

3.基于先序遍历创建输出二叉树的后序遍历序列

 统计利用先序遍历创建的二叉树的深度

 统计利用先序遍历创建的二叉树的宽度

 统计利用先序遍历创建的二叉树叶结点的个数 

 统计利用先序遍历创建的二叉树的度为2的结点个数

 统计利用先序遍历创建的二叉树的度为1的结点个数 

 统计利用先序遍历创建的二叉树中的空链域个数


前言

二叉树有三种遍历方式:先序遍历、中序遍历和后序遍历。

不妨我们现在规定:在任何的遍历方式中,我们都让左子树先于右子树遍历。这样就可以使得遍历方式由6种变为我们规定的以上三种。用N表示根节点的话,这三种遍历方式可以分表示为:NLR,LNR,LRN。

定义二叉树

typedef struct Node
{
	char data;//数据域
	Node *Lchild, *Rchild;//定义左右孩子节点
} BT;

二叉树的创建

void pre_order_creater(BT *&Root)
{
	char ch;
	cin >> ch;
	if (ch == '#')
		Root = NULL;
	else
	{
		Root = (Node *)malloc(sizeof(Node));
		Root->data = ch;
		pre_order_creater(Root->Lchild);//先递归创建左子树
		pre_order_creater(Root->Rchild);//再递归创建右子树
	}
}

建立二叉树建议用先序遍历哟~其余两种在此处不做说明了~

二叉树的遍历

1.基于先序遍历建立输出二叉树的先序遍历序列

void Pre_Order(BT *&Root)
{
	if (Root != NULL)
	{
		cout << Root->data;//先输出当前节点
		Pre_Order(Root->Lchild);//然后遍历左子树
		Pre_Order(Root->Rchild);//最后遍历右子树
	}
}

2.基于先序遍历建立输出二叉树的中序遍历序列

void Pre_Order(BT *&Root)
{
	if (Root != NULL)
	{
		Pre_Order(Root->Lchild); //先遍历左子树
		cout << Root->data;		 //然后输出当前节点
		Pre_Order(Root->Rchild); //最后遍历右子树
	}
}

3.基于先序遍历创建输出二叉树的后序遍历序列

void Pre_Order(BT *&Root)
{
	if (Root != NULL)
	{
		Pre_Order(Root->Lchild); //先遍历左子树
		Pre_Order(Root->Rchild); //然后遍历右子树
		cout << Root->data;		 //最后输出当前节点
	}
}

显然,采取的遍历方式不同,输出的结果也会收到影响。A题时一定要注意题目要求!! 

 统计利用先序遍历创建的二叉树的深度

int tree_deep(BT *&Root)
{
	if (Root == NULL)
		return 0; //如果该节点为空链域,则返回0
	else
		return 1 + max(tree_deep(Root->Lchild), tree_deep(Root->Rchild)); //否则便1加上左右子树深度最大的那个
}

 统计利用先序遍历创建的二叉树的宽度

int maxn = 0, bucket[1005]; //定义全局变量
void Width(BT *&Root, int i)
{
	if (Root != NULL)
	{
		bucket[i]++;
		maxn = max(maxn, bucket[i]);
		Width(Root->Lchild, i + 1);
		Width(Root->Rchild, i + 1);
	}
}

 统计利用先序遍历创建的二叉树叶结点的个数 

int Num(BT *&Root)
{
	if (Root == NULL)
		return 0;
	else if (!Root->Lchild && !Root->Rchild)
		return 1;
	else
		return Num(Root->Rchild) + Num(Root->Lchild);
}

 统计利用先序遍历创建的二叉树的度为2的结点个数

int sum = 0; //定义全局变量
void Num(BT *&Root)
{
	if (Root != NULL)
	{
		if (Root->Lchild && Root->Rchild)	sum++;
		Num(Root->Lchild);
		Num(Root->Rchild);
	}
}

 统计利用先序遍历创建的二叉树的度为1的结点个数 

int sum = 0; //定义全局变量
void Num(BT *&Root)
{
	if (Root != NULL)
	{
		if (Root->Lchild && !Root->Rchild) sum++;
		else if (!Root->Lchild && Root->Rchild) sum++;
		Num(Root->Lchild);
		Num(Root->Rchild);
	}
}

 统计利用先序遍历创建的二叉树中的空链域个数

int Num(BT *&Root)
{
	if (Root == NULL)
		return 1;
	else
		return Num(Root->Lchild) + Num(Root->Rchild);
}

树有许多的东西,本来想再写一下前天学的二叉树与树,森林的转换,但是奈何电脑要没有电了(呜呜呜!),这是一个自己的笔记,后续会陆续进行添加(例如红黑树,哈夫曼树什么的~),修改,有兴趣的可以收藏一下~

写了之后,以后就方便我看了,万一忘记了,嘻嘻!

 

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

詹小友

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值