数据结构:二叉树的基本操作算法实现

题目:
(1)利用二叉树字符串“A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))”创建二叉树的二叉链式存储结构;
(2)输出该二叉树;
(3)输出‘H’节点的左、右孩子结点值;
(4)输出该二叉树的结点个数、叶子结点个数、二叉树的度和高度;

思路:
(1) 以输入’#’作为二叉树节点终止符,利用递归实现二叉树的各个节点的创建。
(2) 利用前序遍历递归算法输出二叉树。
(3) 利用递归寻找是否有节点与H相匹配,一旦匹配,输出其左右孩子的节点值
,若不匹配则递归寻找。
(4) 结点个数:利用整型cnt初始化为0来作为函数引用参数计数,利用类似前序遍历的递归算法,找到一个不为NULL的结点,则cnt+1;
叶子结点:利用整型cnt初始化为0来作为函数引用参数计数,利用类似前序遍历的递归算法,若该结点左右子树均为NULL,则cnt+1;
二叉树的度:该值只有可能为0,1,2,所以利用cnt计数和似前序遍历的递归算法,如果cnt==2,则可以直接返回,无需再查找,若为1,或0,则继续查找,cnt以总取较大值即可;
二叉树的深度:对每一条路径进行深度搜索,如果某个结点为叶子结点,则该层深度为1,叶子结点的上一层则取其左右子树深度的较大值+1,以此类推,最终得出首根结点的值即为二叉树的深度。

代码块:

#include "pch.h"
#include <iostream>
using namespace std;
struct Btree
{
	char data;
	Btree *lchild;
	Btree *rchild;
};
void create(Btree*&root)//创建二叉树
{
	char data;
	cin >> data;
	root = new Btree;
	if (data != '#')//如果不是为终止符号
	{
		root->data = data;//设置数据
		cout << "请输入"<<data<<"的左子树:\n"; create(root->lchild);//建立该结点左子树
		cout << "请输入"<<data<<"的右子树:\n"; create(root->rchild);//建立该结点右子树
	}
	else root = NULL;
}
void preorder(Btree*&root)//前序遍历
{
	cout << root->data << "\t";
	if (root!=NULL)
	{
		if (root->lchild)preorder(root->lchild);
		if (root->rchild)preorder(root->rchild);
	}
}
bool search(Btree*root, char data)//搜索特定节点的左右孩子
{
	if (root == NULL) return false;
	if (root->data == data)//如果结点是寻找结点,输出左右子树
	{
		cout << root->data << "的左子树是:" << root->lchild->data<<endl;
		cout << root->data << ",的右子树是:" << root->rchild->data<<endl;
		return true;
	}
	else {//否则,继续寻找该结点
		return search(root->lchild, data)||search(root->rchild, data);
	}
}
void nodenum(Btree *root, int &cnt)//结点数量
{
	if (root != NULL)//结点不为空
	{
		cnt++;//结点数量加1
		nodenum(root->lchild, cnt);//继续遍历寻找
		nodenum(root->rchild, cnt);
	}
}
void leavenode(Btree*root, int &cnt)//叶子结点数量
{
	if (root != NULL&&root->lchild == NULL&&root->rchild == NULL)cnt++;//如果是叶子结点,数量加1
	else if(root!=NULL)
	{//否则往下寻找叶子结点
		leavenode(root->lchild, cnt);
		leavenode(root->rchild, cnt);
	}
}
int depth(Btree *&tree)//计算二叉树深度
{
	if (tree == NULL) return 0;//如果为空指针,返回0
	else
	{
		int m = depth(tree->lchild) + 1;//计算左子树到该点的最大深度
		int n = depth(tree->rchild) + 1;//计算右子树到该点的最大深度
		if (m >= n) return m;//比较两深度大小,取较大
		else return n;
	}
}
void waynum(Btree*&tree, int &cnt)//计算二叉树的度
{
	if (cnt == 2) return;//如果等于2,而可以返回
	else if (tree != NULL && tree->lchild&&tree->rchild) {
		cnt = 2; return;
	}
	else if (tree->lchild || tree->rchild)
	{
		cnt = cnt > 1 ? cnt : 1;//如果该结点只有左右子树之一,取较大值
		if (tree->lchild) waynum(tree->lchild, cnt);
		if (tree->rchild) waynum(tree->rchild, cnt);
	}
	else {
		cnt = 0; return;
	}
}
int main()
{
	cout << "请输入树的根结点:";
	Btree*tree=new Btree;
	create(tree);
	cout << "该树的前序遍历为:"<<endl; 
	preorder(tree);
	cout << endl;
	if(!search(tree, 'H')) cout<<"该结点不存在"<<endl;
	int cnt=0;
	nodenum(tree,cnt);
	cout << "该树的结点个数为:" << cnt << endl;
	cnt = 0;
	leavenode(tree, cnt);
	cout << "该树的叶子结点个数为:" << cnt << endl;
	cnt = 0;
	waynum(tree, cnt);
	cout << "该二叉树的度为:" << cnt << endl;
	cout<<"该二叉树的深度为:"<<depth(tree)<<endl;
}

输入的二叉树:
在这里插入图片描述
效果图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值