求二叉树结点总数,求ASCII码最大的结点的层次,详解

目录

求二叉树结点总数 

解题思路

总的代码

运行结果

 求结点中ASCII码最大的和该结点的层次

解题思路

总的代码

运行结果


求二叉树结点总数 

(1)假设一棵二叉树为A(B(D,E(G,)),C(,F(,H))),设计一个算法求此二叉树中结点总数并实现。(要求上机实现完整程序代码、核心代码有注释,有运行结果)

解题思路

手绘出二叉树的形状为:

这里使用的是赋值的方法,朴素的搭建起题目要求建的那棵树。

采用递归的方法求出二叉树的结点总数。

总的代码

#include <stdio.h>
#include <stdlib.h>
#include <bits/stdc++.h>
using namespace std;

//定义树的结点
typedef struct bitnode {
	char data;
	struct bitnode *lchild,*rchild;
}bitnode;

int count(bitnode *t) {
	if(t == NULL)
		return 0;
	else return count(t -> lchild) + count(t -> rchild) + 1;
	//采用递归的方法计算结点个数,如果当前结点为空就返回0
}

int main() {
	//初始化树
	bitnode A,B,C,D,E,F,G,H;
	A.data = 'A',A.lchild = &B,A.rchild = &C;
	B.data = 'B',B.lchild = &D,B.rchild = &E;
	C.data = 'C',C.lchild = NULL,C.rchild = &F;
	D.data = 'D',D.lchild = NULL,D.rchild = NULL;
	E.data = 'E',E.lchild = &G,E.rchild = NULL;
	F.data = 'F',F.lchild = NULL,F.rchild = &H;
	G.data = 'G',G.lchild = NULL,G.rchild = NULL;
	H.data = 'H',H.lchild = NULL,H.rchild = NULL;
	
	int num = count(&A);
	
	cout << "二叉树的结点个数为:" << num << endl;
}

运行结果

 求结点中ASCII码最大的和该结点的层次

遍历上述二叉树,求出二叉树中结点ASCII码值最大的结点和该结点的层次(假设根结点层次为1)。(要求程序可执行并附执行结果)

解题思路

我的想法是使用两次先序遍历

        第一次找到ASCII码最大的结点。

        由于先序遍历是一个递归的遍历,如果要找里面的最大值,那么使用一般局部变量和全局变量都不太合适,于是我使用了静态局部变量,确保不会出现定义模糊的情况。

char preorder_max(bitnode *t) {
	static char max = 0;
	//这里采用静态局部变量,防止发生模糊定义的情况
	if(t == NULL)
		return 0;
	if(t -> data > max)
		max = t -> data;
	preorder_max(t -> lchild);
	preorder_max(t -> rchild);
	return max;
}

        第二次先序遍历就可以由这个节点的data值得到它的层次。同样是一个递归的思路,但没上一个好理解,可以边看代码边理解。

int solve(bitnode *t,int max,int h) {
	int l;
	if (t == NULL)
		//如果当前节点为空,返回0
		return 0;
	else if (t -> data == max)
		//如果当前节点的值等于max,返回当前层次h
		return h;
	else 
	//否则,递归在左子树中查找,如果未找到,再在右子树中查找
	{
		l = solve(t -> lchild,max,h+1);	//在左子树中查找
		if (l != 0) 
			//如果找到了,返回结果
			return l;
		else
			//在左子树中未找到,再在右子树中查找
			return(solve(t -> rchild,max,h+1));
	}
}

总的代码

#include <stdio.h>
#include <stdlib.h>
#include <bits/stdc++.h>
using namespace std;

//定义树的结点
typedef struct bitnode {
	char data;
	struct bitnode *lchild,*rchild;
}bitnode;

char preorder_max(bitnode *t) {
	static char max = 0;
	//这里采用静态局部变量,防止发生模糊定义的情况
	if(t == NULL)
		return 0;
	if(t -> data > max)
		max = t -> data;
	preorder_max(t -> lchild);
	preorder_max(t -> rchild);
	return max;
}

int solve(bitnode *t,int max,int h) {
	int l;
	if (t == NULL)
		//如果当前节点为空,返回0
		return 0;
	else if (t -> data == max)
		//如果当前节点的值等于max,返回当前层次h
		return h;
	else 
	//否则,递归在左子树中查找,如果未找到,再在右子树中查找
	{
		l = solve(t -> lchild,max,h+1);	//在左子树中查找
		if (l != 0) 
			//如果找到了,返回结果
			return l;
		else
			//在左子树中未找到,再在右子树中查找
			return(solve(t -> rchild,max,h+1));
	}
}

int main() {
	//初始化树
	bitnode A,B,C,D,E,F,G,H;
	A.data = 'A',A.lchild = &B,A.rchild = &C;
	B.data = 'B',B.lchild = &D,B.rchild = &E;
	C.data = 'C',C.lchild = NULL,C.rchild = &F;
	D.data = 'D',D.lchild = NULL,D.rchild = NULL;
	E.data = 'E',E.lchild = &G,E.rchild = NULL;
	F.data = 'F',F.lchild = NULL,F.rchild = &H;
	G.data = 'G',G.lchild = NULL,G.rchild = NULL;
	H.data = 'H',H.lchild = NULL,H.rchild = NULL;
	
	char max = preorder_max(&A);
	cout << "ASCII码值最大的结点为:";
	cout << max << endl;
	
	int layer = solve(&A,max,1);
	cout << "这个结点的层数为:" << layer << endl;
}

运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

柏箱

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

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

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

打赏作者

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

抵扣说明:

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

余额充值