3010基于二叉链表的二叉树高度的计算(附思路,WA的一种可能情况及代码)

基于二叉链表的二叉树高度的计算

描述

设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写递归算法计算二叉树的高度。

输入

多组数据。每组数据一行,为二叉树的前序序列(序列中元素为‘0’时,表示该结点为空)。当输入只有一个“0”时,输入结束。

输出

每组数据分别输出一行,为二叉树的高度。

输入样例 1 

abcd00e00f00ig00h00
abd00e00cf00g00
0

输出样例 1

4
3

用两个int  maxi和max1来分别记录总体最大值和当前走过的最大值。

错误思路:

若bt走到了NULL,说明已经遍历到一个枝条的结尾了,这个时候比较maxi和max1,更新maxi的值,并令max1=0,否则令max1++并继续遍历。

错误就在于不应该让max1=0,因为回退一次之后,再走其他的节点是 在这个节点路径的基础之上的,就相当于“站在前人的肩膀上”,如果因为当前节点走到头了就把之前走过的路径全部清空,再从它的parent遍历其他分支的时候,就会存在parent以上的节点没有被计算进总路径的问题!

错误代码:

#include <iostream>
using namespace std;
typedef struct BNode
{
	char data;
	struct BNode* lchild, *rchild;
}*BTree, BNode;
int max1 = 0, maxi = 0;
void Create(BTree& bt)
{
	char c;
	cin >> c;
	if (c == '0')
		bt = NULL;
	else
	{
		bt = new BNode;
		bt->data = c;
		Create(bt->lchild);
		Create(bt->rchild);
	}
}
void Create(BTree& bt,char c)
{
	if (c == '0')
		bt = NULL;
	else
	{
		bt = new BNode;
		bt->data = c;
		Create(bt->lchild);
		Create(bt->rchild);
	}
}
void Traverse(BTree bt)
{
	if (bt == NULL)
	{
		maxi = max1 > maxi ? max1 : maxi;
		max1 = 0;
		return;
	}
	else
	{
		max1++;
		Traverse(bt->lchild);
		Traverse(bt->rchild);
	}
}
int main()
{
	while (1)
	{
		char c;
		cin >> c;
		if (c == '0')
			break;
		BTree b;
		Create(b, c);
		Traverse(b);
		cout << maxi << endl;
		maxi = 0;
	}
	return 0;
}

正确思路:

设置maxi和max1的思路是对的,这个计算长度和DFS迷宫问题的思路有些相似了,就是先从当前节点出发走遍所有的可能节点,再回退遍历其他路径,比较两种路径的大小取最大值即可。所以就要让max1在每次遍历完回退之后都--(就是回退到自己这一步,再尝试其他的路)。

真是要学会举一反三呀,不能学了DFS就把思路都局限在迷宫问题上了!

正确代码如下:

#include <iostream>
using namespace std;
typedef struct BNode
{
	char data;
	struct BNode* lchild, * rchild;
}*BTree, BNode;
int max1 = 0, maxi = 0;//不能写max,max是内置函数的名字
void Create(BTree& bt)
{
	char c;
	cin >> c;
	if (c == '0')
		bt = NULL;
	else
	{
		bt = new BNode;
		bt->data = c;
		Create(bt->lchild);
		Create(bt->rchild);
	}
}
void Create(BTree& bt, char c)
{
	if (c == '0')
		bt = NULL;
	else
	{
		bt = new BNode;
		bt->data = c;
		Create(bt->lchild);
		Create(bt->rchild);
	}
}
void Traverse(BTree bt)
{
	if (bt)
	{
		max1++;
		Traverse(bt->lchild);
		Traverse(bt->rchild);
		maxi = max1 > maxi ? max1 : maxi;//更新maxi的值
		max1--;//max1回退到之前的位置,假设这一步没走过
	}
}
int main()
{
	while (1)
	{
		char c;
		cin >> c;
		if (c == '0')
			break;
		BTree b;
		Create(b, c);
		Traverse(b);
		cout << maxi << endl;
		maxi = 0;
		max1 = 0;
	}
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 基于二叉链表存储结构的二叉树计算系统是一种利用二叉树数据结构实现的计算系统。该系统可以通过二叉树的遍历算法来实现各种计算操作,包括加减乘除、幂、根号等。在该系统中,每个节点都可以表示一个操作符或操作数,而二叉树的结构则可以表示操作符之间的优先级关系。通过遍历二叉树,可以按照正确的顺序执行各种计算操作,从而得到正确的结果。该系统具有简单、高效、易于扩展等优点,可以广泛应用于各种计算场景中。 ### 回答2: 二叉链表一种二叉树的存储结构,它使用指针将每个节点与其父节点、左子节点和右子节点连接起来。基于二叉链表二叉树计算系统利用二叉树的特点,实现数学表达式的计算,能处理各种数学运算和优先级,是计算机科学领域中一大重要的算法。 二叉链表可以储存任何二叉树结构,包括储存在二叉树中的各种数学运算。在基于二叉链表存储的二叉树计算系统中,每个节点都可以储存一个操作符或操作数,实现组个可以被计算的表达式。二叉链表的左子节点和右子节点在这里表示操作符的左右操作数,这样可以简单地将运算符和操作数组织起来,快速构建出计算表达式。 基于二叉链表二叉树计算系统,也可以采用后缀表达式来简化运算和计算表达式。后缀表达式也称为逆波兰表达式,与传统的中缀表达式不同,它将操作符置于操作数之后。这样,所有的计算都可以直接按照后缀表达式中的顺序进行,大大简化了计算的算法。 综合来看,基于二叉链表二叉树计算系统可以将数学表达式快速转换为二叉树结构,通过二叉链表连接各个节点,可以方便地实现各种数学运算,并能够采用后缀表达式简化计算流程。这种基于二叉链表二叉树计算系统,成功地将数据结构和算法相结合,提升了程序运行的效率和算法的可维护性,为计算和数据处理提供了一个高效可靠的解决方案。 ### 回答3: 基于二叉链表存储结构的二叉树计算系统是一种计算机科学中较为常见的数据结构,在数学和计算机科学中有广泛的应用。在这种系统中,二叉树一种非线性数据结构,其中每个节点最多具有两个子节点。 在二叉链表存储结构中,每个节点都包含了一个指向其左子节点和右子节点的指针。这种结构使得计算系统能够轻松地遍历整个二叉树,并在节点之间传递信息。 在二叉树计算系统中,通过在二叉树上进行遍历,可以实现各种计算任务,如查找最小值、计算二叉树中节点数等。同时,在二叉树中还可以存储表达式,通过遍历二叉树以解析表达式的值。 二叉树计算系统能够完成的任务非常多。其中,最常见的任务之一是查找二叉树上最小值或最大值。这可以通过不断遍历二叉树并寻找最小值/最大值来实现。 此外,二叉树计算系统还可用于实现搜索功能。这种系统能够遍历整个二叉树以查找特定的值。例如,一个计算系统可以在二叉树中查找特定的项,或在表达式中查找特定的运算符。 总之,二叉链表存储结构的二叉树计算系统是一种功能强大的数据结构,具备高效、灵活等特点,在计算机科学和数学中有着广泛的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值