第04次作业-树
2018-05-05 20:13 黑鹰1096 阅读(508) 评论(0) 编辑 收藏 举报1.学习总结
1.1树结构思维导图
1.2 树结构学习体会
树是一种非线性结构,其定义是递归为主。
根据先序遍历、中序遍历、后序遍历确定唯一二叉树;二叉树,树,森林间的相互转化;将二叉树线索化;找出哈夫曼树,求解节点的哈夫曼编码;利用并查集求解等价问题;
2.PTA实验作业
本周要求挑选出3道题目书写设计思路、调试过程。设计思路使用伪代码描述。题目选做要求:
- 如果选6-1,只需要描述建树的伪代码。
- 6-4必选
具体书写内容及格式如下:
2.1 题目1:
6-2 求二叉树高度
本题要求给定二叉树的高度。
函数接口定义:
int GetHeight( BinTree BT );
其中BinTree
结构定义如下:
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
要求函数返回给定二叉树BT的高度值。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
typedef char ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
BinTree CreatBinTree(); /* 实现细节忽略 */
int GetHeight( BinTree BT );
int main()
{
BinTree BT = CreatBinTree();
printf("%d\n", GetHeight(BT));
return 0;
}
/* 你的代码将被嵌在这里 */
输出样例(对于图中给出的树):
4
2.2 设计思路(伪代码或流程图)
求二叉树高度的递归模型f(b)如下:
当 b = NULL;
f(b)=0
当b!= NULL
f(b)=Max{f(b->child),f(b->rchild)}+1;
2.3 代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)
2.4 PTA提交列表说明。
这串代码与书上的第172页的求高度的一样但由于我的粗心没有把题目看清,把lchild与rchild改为Lift与Right
2.1 题目2:
7-1 还原二叉树(25 分)
给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。
输入格式:
输入首先给出正整数N(≤50),为树中结点总数。下面两行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区别大小写)的字符串。
输出格式:
输出为一个整数,即该二叉树的高度。
输入样例:
9
ABDFGHIEC
FDHGIBEAC
输出样例:
5
2.2 设计思路(伪代码或流程图)
采用递归算法;
若b==NULL
f(b,x)= NULL
当b->data==x;
f(b,x) = b
若左子树中找到了,即p = f(b->lchild,x)且片!=NULL
f(b,x) = p
其他情况下 f(b,x) = f(b->rchild,x);
TreeNode*findTree(char*in,char*pre,int length)
用上述的查找节点的函数进行对应的递归算法就可以了
2.3 代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)
2.4 PTA提交列表说明。
编译错误是因为没有查找的过程,之后问同学就告诉我要有查节点这一步骤
2.1 题目3:
6-4 jmu-ds-表达式树(25 分)
- 输入一行中缀表达式,转换一颗二叉表达式树,并求解.
- 表达式只包含
+
,-
,*
,/
,(
,)
运算符,操作数只有一位,且为整数(有兴趣同学可以考虑负数小数,两位数做法)。按照先括号,再乘除,后加减的规则构造二叉树。 - 如图所示是"1+(2+3)*2-4/5"代数表达式对应二叉树,用对应的二叉树计算表达式的值。 转换二叉树如下:
输入要求
输入一行字符串
输出要求
输出结算结果,如遇到除0,提示divide 0 error!
函数接口定义:
void InitExpTree(BTree &T,string str) ; //建表达式的二叉树
double EvaluateExTree(BTree T);//计算表达式树
T
:二叉树 str
:输入的表达式
裁判测试程序样例:
#include<iostream>
#include<string>
#include<stack>
using namespace std;
typedef struct BiTNode{ //二叉树的二叉链表存储表示
char data;
struct BiTNode *lchild,*rchild;
}BTNode,*BTree;
void InitExpTree(BTree &T,string str) ; //建二叉表达式树
double EvaluateExTree(BTree T);//计算表达式树
char Precede(char t1,char t2) ;//比较t1,t2运算符优先级函数
int In(char c) ;//判断c是否运算符
void CreateExpTree(BTree &T,BTree a,BTree b,char ch);//建简单二叉树
void DestroyBTree(BTree bt);//销毁树
int main()
{
string str;
BTree T;
getline(cin,str);
InitExpTree(T,str); //创建表达式树
cout<<EvaluateExTree(T); //输出值
DestroyBTree(T);
return 0;
}
char Precede(char t1,char t2)
{ /*判断两符号的优先关系 */
char f;
switch(t2)
{
case '+':if(t1=='('||t1=='#')
f='<';
else
f='>';
break;
case '-':if(t1=='('||t1=='#')
f='<';
else
f='>';
break;
case '*':if(t1=='*'||t1=='/'||t1==')')
f='>';
else
f='<';
break;
case '/':if(t1=='*'||t1=='/'||t1==')')
f='>';
else
f='<';
break;
case '(':if(t1!=')')
f='<';
break;
case')':if(t1=='(')
f='=';
else
f='>';
break;
case'#':if(t1=='#')
f='=';
else
f='>';
}
return f;
}
int In(char c)
{ /* 判断c是否为运算符 */
switch(c)
{
case '+':
case'-':
case'*':
case '/':
case'#':
case '(':
case')':return 1;break;
default:return 0;
}
}
void CreateExpTree(BTree &T,BTree a,BTree b,char ch){ //简单二叉树的创建
T=new BTNode;
T->data=ch;
T->lchild=a;
T->rchild=b;
}
void DestroyBTree(BTree bt)//销毁树
{
if(bt!=NULL)
{
DestroyBTree(bt->lchild);
DestroyBTree(bt->rchild);
delete bt;
}
}
/* 请在这里填写答案 */
输入样例:
1+2*3
输出样例:7
2.3 代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)
2.4 PTA提交列表说明。
该怎么做都不知道就只能抄同学的
3.截图本周题目集的PTA最后排名
3.1 PTA排名截图
3.2 我的总分:
本题评分规则:
1.5分
4. 阅读代码(必做)
代码相关地址:http://www.cnblogs.com/NeilHappy/archive/2013/04/04/2999050.html
优点: 在这里看到了这个题。层次遍历是用队列,一级一级地入队列然后输出。而用递归的话,我首先想到是用两个栈来模拟队列,在递归遍历二叉树的过程中入栈,然后最后一次性出栈。但仔细思考后发现无法做到层次遍历。在这里看到了正确的方法。
5. 代码Git提交记录截图