1.本周学习总结
1.1思维导图
1.2.对树的认识及学习体会
感觉从树开始,数据结构这门课的难度一下子升高了不少。对于树的题目,感觉有点不知如何下手,一个问题的解决思路都没有办法结合树的内容想出来。平时的pta编程题打起来着实困难,即使知道此问题的做法,却还是不能用代码来实现。
2.PTA实验作业
2.1.题目1:6-4 jmu-ds-表达式树
2.1.1设计思路
建表达式二叉树
建op栈,op.push('#')
初始化根节点栈:stacktree栈
while(表达式未结束)
if(ch==操作数)
then 生成一个只有根结点的子树T stacktree.push(T)
if(ch==运算符)
then
while(ch<op栈顶运算符) 栈顶优先级高,则
创建一个树结点T,数据为op.top()
stacktree弹出2个根结点T1,T2
T->lchild=T1,T->rchild=T2
stacktree.push(T)
if(ch>op顶运算符) op.push(ch)
if(ch==op顶运算符) 则op.pop()
计算表达式树
double sum=0
if(T不为空)
then
if(左右子树不为空)
then 返回对应数值
递归左右子树得到a,b
switch(结点值)
case +:计算并返回a+b
case - : 计算并返回a-b
case * : 计算并返回a*b
case / :
if(除数为0)
then 直接输出错误并退出
else 计算并返回a/b
2.1.2代码截图
2.1.3本题PTA提交列表说明。
- Q1:编译错误
- A1:将rchild写成rchlid
2.2.题目2:7-4 jmu-ds-二叉树叶子结点带权路径长度和
2.2.1设计思路
BTree CreateBTree(int i)
设定BTree变量BT
if(i>str.size()-1) return NULL;
if(是'#',是空节点) return NULL;
为BT开辟一个空间
BT->data=str[i];
BT的lc应该是第2*i的元素
rc应该是第2*i+1的元素
return BT;
void GetWpl(BTree BT,int &wpl,int h)
定义h表示深度
先判断是否是叶子节点
if(BT->Left==NULL&&BT->Right==NULL)
wpl=深度*当前data的值
深度归零
h++
若是空节点,return
非空非叶
递归访问其左右子树
GetWPL(BT->Left,wpl,h);
GetWPL(BT->Right,wpl,h);
2.2.2代码截图
2.2.3本题PTA提交列表说明。
2.3.题目3:7-1 还原二叉树
2.3.1设计思路
int DFS(char a[],char b[],int n)
if结点个数非法
返回 0;
for i=0 to n
if数组a和数组b中的字符相等
break;
左子树高度x=DFS(a+1,b,i)+1;
右子树高度y=DFS(a+i+1,b+i+1,n-i-1)+1;
if x大于y
返回 x;
else
返回 y;
2.3.2代码截图
2.3.3本题PTA提交列表说明。
3、阅读代码
3.1 题目:计算一棵树的宽度(并输出每一层的宽度)
3.2 解题思路
这里需要用到二叉树的层次遍历,即广度优先周游。在层次遍历的过程中,通过读取队列中保留的上一层的节点数来记录每层的节点数,以获取所有层中最大的节点数。
3.3 代码截图
3.4 学习体会
通过此题,加成了对于层次遍历的做法,相对于前中后序遍历来说,层次遍历需要用队列辅助实现,对于代码的操作多了许多