DS博客作业05--树
1.本周学习总结(0--2分)
1.思维导图
2.谈谈你对树结构的认识及学习体会。
树这一节主要的是建树比较难,其实思路都还好,就一直是实现这个功能比较难,树是从左子树开始遍历,还分前序中序和后序遍历,前序是根左右,中序是左根右,后序是左右根。
2.PTA实验作业(6分)
2.1.题目1: 还原二叉树
2.1.1设计思路(伪代码)
CreatBt函数
首先定义 i
然后定义先序的左子树和右子树以及中序的左子树和右子树
if (n是否为0或T是否为空)判断是否为空树
如果是返回NULL
pre[0]储存根节点的值
if(i<n1&&in[i]!=pre[0])判断是否读到了根结点
如果没则持续读数赋给lin数组并且n1递增
else
开始将读数赋给rin数组,n2递增
然后再一个for循环
if(i<n1+1)代表此时还是左子树
将pre数组的值持续赋给lpre数组 m1递增
else
将pre数组的值赋给rpre m2递增
然后就是创建函数的持续递归
T->lchild = CreatBt(lpre,lin,n1);
T->rchild = CreatBt(rpre,rin,n2);
GetHeight函数
定义lh和rh分别代表左子树的长度和右子树的长度
if(BT=NULL)即空树
else
lh = GetHeight(BT->lchild);//左子树的长度
rh = GetHeight(BT->rchild);//右子树的长度
return (lh > rh ? lh : rh) + 1; //返回大的子树长度+1
递归得出左子树和右子树的长度最后比较大小并且+1,因为有一个根结点
2.1.2代码截图
2.1.3本题PTA提交列表说明。
•Q1:没有考虑到空树的情况,导致段错误。
•Q2:最后得出较高子树的高度时直接返回,没有加一,即忽略了根节点。导致答案错误
2.2.题目2:jmu-ds-二叉树叶子结点带权路径长度和
2.2.1设计思路(伪代码)
建树函数
BiTree create (string str ,int n) 定义str字符串数组,以及n控制数组下标
if(读到的字符为‘#’)或者 if(n>str.size) ,即str数组长度为0
return 返回NULL
BT->data=str[n] 赋予根节点值
BT->lchild=create(str,2*n) 左右子树的位置
BT->rchild=create(str,2*n+1)
return 返回BT;
求权函数
void GetWPL(BiTree bt, int h, int&wpl) 引用定义wpl为权和,定义h为高度
if(bt==空) return 树空返回
if(bt的左孩子和右孩子同时为空) 即证明这个结点是叶子结点
wpl+=wpl+(bt->data-'0')*h;
GetWPL(bt->lchild, h + 1, wpl); 递归遍历子树
GetWPL(bt->rchild, h + 1, wpl);
2.2.2代码截图
2.2.3本题PTA提交列表说明。
•Q1: 一开始不太熟悉递归的用法,不知道第一个函数应该怎么用递归,然后看了同学的代码明白了这一题递归是持续传入左子树以及右子树在数组中的位置
2.3.题目3:根据后序和中序遍历输出先序遍历
2.3.1设计思路(伪代码)建树函数
先传入中序序列以及后续序列的起始位置以及他们的长度
if( in即中序序列的值等于根节点) //表示遍历完左子树
break 退出遍历
T->data=*p; 将p赋给T的根节点
len代表长度=p-in
T->lchild=Build(in,post,len)递归传回中序序列以及后序序列以及改变后的长度
return T; 返回T树
先序输出T树的数
if(T不为空)
输出此时遍历到的结点的值
递归调用PreOrder函数