【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);
}

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

写了之后,以后就方便我看了,万一忘记了,嘻嘻!【SWUST-数据结构】二叉树-笔记_第1张图片

 

你可能感兴趣的:(我的随笔,数据结构系列(SWUST,OJ题解)(努力更新中),数据结构)