这道题有点难啊我觉得。我想了很久自己还是没想出来,递归和非递归都想不出来。
16 二叉树:以x为根的子树的深度
作者: 冯向阳时间限制: 1S章节: DS:树
截止日期: 2022-06-30 23:55:00
问题描述 :
目的:使用C++模板设计二叉树的抽象数据类型(ADT)。并在此基础上,使用二叉树ADT的基本操作,设计并实现简单应用的算法设计。
内容:(1)请参照链表的ADT模板,设计二叉树的抽象数据类型。(由于该环境目前仅支持单文件的编译,故将所有内容都集中在一个源文件内。在实际的设计中,推荐将抽象类及对应的派生类分别放在单独的头文件中。参考教材、课件,以及网盘中的链表ADT原型文件,自行设计二叉树的ADT。)
注意:二叉树ADT的基本操作的算法设计很多要用到递归的程序设计方法。
(2)ADT的简单应用:使用该ADT设计并实现若干应用二叉树的算法设计。
应用4:要求设计一个递归算法,计算二叉树以元素值为x的结点为根的子树的深度。二叉树的存储结构的建立参见二叉树应用1。
参考函数原型:
//求二叉树中以元素值为x的结点为根的子树的深度 (外壳)
template
void Get_Height( BinaryTree
//查找二叉树中元素值为x的结点 (递归)
template
void Get_x_Height( BinaryTreeNode
//求二叉树中以元素值为x的结点为根的子树的深度 (递归)
template
int Get_Height_Cursive( BinaryTreeNode
输入说明 :
第一行:表示无孩子或指针为空的特殊分隔符
第二行:二叉树的先序序列(结点元素之间以空格分隔)
第三行:元素值x
输出说明 :
第一行:分两种情况输出
"No Such Node" //未找到元素值为x的结点
子树的深度 //找到元素值为x的结点
输入范例 :
#
A B D # # E G # # H # # C # F I # J # # #
F
输出范例 :
3
以下参考c语言中?:是什么意思?_fiveym的博客-CSDN博客_c语言中?:是什么意思
先讲一下三目运算符的用法(下面的代码核心会用到)
条件运算符(?:)是C语言中唯一的一个三目运算符,它是对第一个表达式作真/假检测,然后根据结果返回另外两个表达式中的一个。
二、使用步骤
<表达式1>?<表达式2>:<表达式3>
在运算中,首第一个表达式进行检验,如果为真,则返回表达式2的值;
如果为假,则返回表达式3的值。
例代码如下(示例):
max = ((a>b)?a:b)>c?((a>b)?a:b):c;
在上述代码求a,b,c中的max值,先求表达式((a>b)?a:b)中的max值,若a>b为真,则输出a的值;若a>b为假则输出b的值。再用((a>b)?a:b)所比较出来的值与c进行比较,若((a>b)?a:b)>c为真则输出((a>b)?a:b)的值;若((a>b)?a:b)>c为假,则输出c的值。
#include
#include
using namespace std;
int t = 0;
int judge = 0;
int max1 = 0;
struct student
{
string data;
student* left;
student* right;
};
student* target = NULL;//后面要用 先做个铺垫
void creat(student*& T, string kk)
{
string ch;
cin >> ch;
if (ch == kk)
{
T = NULL;
}//但凡输入了#号 该节点下一位停止
else
{
T = new student;
T->data = ch;
creat(T->left, kk);
creat(T->right, kk);
}
}
void find(student* root,string x)//用来寻找结点的地址
{
student* p = root;
if (p == NULL)
{
return;
}
else if (p->data == x)
{
judge = 1;
target = p;//核心 找到p的地址 抓包给全局变量 target现在的值就是所求的地址
}
else if (p != NULL&&p->data!=x)
{
find(p->left,x);
find(p->right, x);
}
}
int getDepth(student* root)//代码的核心 这段我是抄的 我真的不会
{
int left, right;
if (root == NULL) //递归出口
return 0;
else
{
left = getDepth(root->left); //递归
right = getDepth(root->right);
return left > right ? (left + 1) : (right + 1); //返回较深的一棵子树
}
}
int main()
{
student* root;
string kk;
cin >> kk;
creat(root, kk);
string x;
cin >> x;
find(root,x);
student* newroot = target;
if (judge == 0)
{
cout << "No Such Node" << endl;
}
else if (judge == 1)
{
cout <
核心代码参考【代码+注释】求二叉树的深度【超详细】递归+非递归实现_Chaim16的博客-CSDN博客_二叉树的深度代码