博客作业04--树
1.学习总结(2分)
1.1树结构思维导图
使用思维导图将树结构的知识点串在一起。树中的每个知识点需细化到每个操作如何实现。
1.2 树结构学习体会
谈谈你对树结构认识,学习这个结构是否遇到哪些困难及树结构可以解决的问题。
认识:树是非线性的数据结构,每一个节点都只有一个前驱(根节点除外),但是可以有零个或多个后继。这些数据节点按分支关系组织起来,清晰地反映了数据元素之间的层次关系,数据元素之间存在的关系是一对多的关系。
困难:之前都是用非递归的方法创建树,没用过递归的方法创建过树,所以不会用。哈夫曼树该如何用代码实现建立还不是很懂
可以解决的问题:朋友圈、亲戚关系
2.PTA实验作业(4分)
2.1 题目1:
6-4jmu-ds-表达式树
2.2 设计思路(伪代码或流程图)
定义整型变量i=0,flag,字符型变量ch,f
初始化运算符栈st,#为栈底符号
初始化树栈BT
while str[i]
调用函数判断是否是运算符
if 是运算符
ch=栈顶元素
调用函数比较一下优先级
栈顶符号的优先级高,栈顶符号出栈,将它作为一个节点创建树,并从栈BT中依次取出两个作为它的右孩子和左孩子,然后将这个节点放入栈BT
当前符号的优先级高,入栈st
优先级相等,栈顶元素出栈
否则
将它作为一个节点建树,左右子树都为空,然后将它放入栈BT中
end while
while 运算符栈st不为空
ch=栈顶元素
if ch为#,结束循环
否则
将它作为一个节点创建树,并从栈BT中依次取出两个作为它的右孩子和左孩子,然后将这个节点放入栈BT
end while
2.3 代码截图
2.4 PTA提交列表说明。
树建立起来了,但是不知道怎么求值,参考了同学和书上的代码,做出来了。
2.1 题目2:
7-8 jmu-ds-二叉树叶子结点带权路径长度和
2.2 设计思路(伪代码或流程图)
定义全局变量wpl=0
if 根节点T为空
return 0
if 根节点的左孩子跟右孩子都为空
wpl=wpl+根节点的值*深度depth
否则
访问左子树
WPL (T->lchild,depth+1)
访问右子树
WPL (T->rchild,depth+1)
2.3 代码截图
2.4 PTA提交列表说明。
建树的方法有点小问题,刚开始不知道,后面用找叶子结点的方法知道了自己建树出了错,改了之后就通过了
2.1 题目3:
7-3 jmu-ds-二叉树层次遍历
2.2 设计思路(伪代码或流程图)
定义BTree类型的变量p和队列qu
根节点入队列
while 队列不为空
p=队列里的队头元素
输出这个元素的值
if左孩子存在
左孩子入队列
if右孩子存在
右孩子入队列
end while
2.3 代码截图
2.4 PTA提交列表说明。
建树的时候,采用非递归的方法,少写了一次结束建树的条件:if(str[i]=='\0') break;
3.截图本周题目集的PTA最后排名(3分)
本次题目集总分:285分
必做题共:230分
3.1 PTA排名
3.2 我的得分
230
4. 阅读代码(必做,1分)
BTree CreateBTree(string str,int i)
{
int len;
BTree bt;
bt=new TNode;
len=str.size();
if(i>len-1 || i<=0) return NULL;
if(str[i]=='#') return NULL;
bt->data =str[i];
bt->lchild =CreateBTree(str,2*i);
bt->rchild =CreateBTree(str,2*i+1);
return bt;
}
这是考试时,老师放出来的建立二叉树的代码
该段代码用递归的方式实现了二叉树的建立,短短几行的代码就能实现二叉树的建立,对比之前用非递归的方法,实在是好用太多了,非递归的写了一大串代码。
可惜自己并不会这种方法,也没写过,考试的时候就懵逼了。