这道题有点难啊我觉得。我想了很久自己还是没想出来,递归和非递归都想不出来。
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博客_二叉树的深度代码



