任务描述
本关任务:给出一棵二叉树的括号表示法,本题要求实现3个函数,根据给出的括号表示法创建该二叉树并输出。输出时,也按二叉树的括号表示法输出。然后再求出二叉树高度并输出。
相关知识
二叉树的括号表示法如图所示:
上面5棵二叉树中,从左至右,每棵二叉树的括号表示法依次为:A,A(B,C),A(B(D),C),A(B(,D),C(E)),A(B(D,E),C(F,G))。
编程要求
代码窗口中给出了二叉树类型定义文件binary_tree.h和实现文件binary_tree.cpp。您的任务是根据提示,在右侧编辑器补充代码,完成给定的3个函数。函数声明如下:
// 利用二叉树的括号表示法创建二叉树root
// 参数:二叉树的根结点指针root。
// 参数:二叉树的括号表示法字符串s。
void CreateTree(BTNode* &root, ElemType* s);
//以嵌套括号表示法输出一棵树
void DispTree(BTNode* root);
// 求二叉树的高度
// 参数:二叉树根节点root
int getHeight(BTNode* root);
测试说明
平台会对你编写的代码进行测试:输入样例1:
A(B(D),C)(对应二叉树如下)
输出样例1:
A(B(D),C)
3输入样例2:
A(B(,D),C(E))(对应二叉树如下)
输出样例2:
A(B(,D),C(E))
3
开始你的任务吧,祝你成功!
测试代码:
#include "binary_tree.h"
//根据嵌套括号表示法的字符串生成链式存储的二叉树
void CreateTree(BTNode* &root, char str[]) {
/*请在BEGIN和END之间实现你的代码*/
/*****BEGIN*****/
/******END******/
}
//以嵌套括号表示法输出一棵二叉树
void DispTree(BTNode* root) {
/*请在BEGIN和END之间实现你的代码*/
/*****BEGIN*****/
/******END******/
}
// 求二叉树的高度
// 参数:二叉树根节点root
int getHeight(BTNode* root)
{
/*请在BEGIN和END之间实现你的代码*/
/*****BEGIN*****/
/******END******/
}
补充代码:
#include "binary_tree.h"
//根据嵌套括号表示法的字符串生成链式存储的二叉树
void CreateTree(BTNode* &root, char str[]) {
/*请在BEGIN和END之间实现你的代码*/
/*****BEGIN*****/
BTNode* St[60], * p; root = NULL;
int top = -1, k, i = 0; //栈顶指针
char ch = str[i];
while (ch != '\0'){
switch (ch){
case '(':top++; St[top] = p; k = 1; break;
case ')':top--; break;
case ',': k = 2; break;
default:
p = (BTNode*)malloc(sizeof(BTNode));
p->data = ch;
p->lchild = p->rchild = NULL;
if (root == NULL)
root = p;
else{
k == 1 ? St[top]->lchild = p : St[top]->rchild = p;
}
}
ch = str[++i];
}
/******END******/
}
//以嵌套括号表示法输出一棵二叉树
void DispTree(BTNode* root) {
/*请在BEGIN和END之间实现你的代码*/
/*****BEGIN*****/
if (root != NULL){
printf("%c", root->data);
if (root->lchild != NULL || root->rchild != NULL){
printf("(");
DispTree(root->lchild);
if (root->rchild != NULL)
printf(",");
DispTree(root->rchild);
printf(")");
}
}
/******END******/
}
// 求二叉树的高度
// 参数:二叉树根节点root
int getHeight(BTNode* root)
{
/*请在BEGIN和END之间实现你的代码*/
/*****BEGIN*****/
int lchildh, rchildh;
if (root == NULL) return 0;
else{
lchildh = getHeight(root->lchild);
rchildh = getHeight(root->rchild);
return (lchildh > rchildh) ? (lchildh + 1) : (rchildh + 1);
}
/******END******/
}