博客作业04--树
1.学习总结(2分)
1.1树结构思维导图
1.2 树结构学习体会
学了这么久的树,觉得树是一个很神奇也很复杂的东西,光是构造就有很多种,再加上各种遍历,对我来说是一道需要攻破的难关,首先呢要充分的学习递归的调用,递归熟了,树就攻下了大半了,其中树的一些复杂的构造,如:哈夫曼树的构造,线索二叉树的构造等,都需要借助课本来完成,自己还没有很明确的思路,并交集也不怎么明白。
2.PTA实验作业(4分)
2.1 题目1:7-8 jmu-ds-二叉树叶子结点带权路径长度和
2.2 设计思路
定义变量str和BT,输入str
利用函数BTree CreateBTree( string str , int n )构造树
{
定义树的指针BT
判断树是否空,如果str[1]=='#'代表根结点不存在,返回NULL,若输入的根结点位置大于str的长度(小于等于0)也返回NULL
给BT一个空间,new BTree;给BT->data赋值str[i];
利用孩子节点和双亲节点的下标位置关系(若双亲节点下标为i,则左孩子的下标为2i,右孩子下标为2i+1)递归构造树;
BT->lchild=CreateBTree( str , 2n ); 和BT->rchild=CreateBTree( str , 2n+1 );
最后返回根结点指针;
}
利用函数void Sum(BTree BT,int h)计算叶子节点的带权路径长度和
{
用类似遍历树的方法先判断根节点是不是叶子节点(左右孩子都为NULL);
利用递归先遍历左子树,每递归一次,增加一层高度h++,
后遍历右子树,同样每递归一次,增加一层高度h++,
当遍历到叶子节点时,用data*高度h,加到sum中;
输出sum;
}
2.3 代码截图
2.4 PTA提交列表说明
- 图中的部分正确的思路是:先把所有叶子节点的值加起来再算出树的高度最后俩者相。,所以怎么调试都是部分正确。改了很久,想了想,如果树的叶子节点不在同一层那这样写的算法就错了,然后就改正过来了。
2.1 题目2:7-2 根据后序和中序遍历输出先序遍历
2.2 设计思路
利用函数BTNode (有星号)CreateBT(int *post , int *mid , int n)后序中序构造二叉树的函数
{
首先是传入后序和中序序列和序列长度;int *post , int mid , int n;
定义结构体指针变量b,指针p,int型变量i,k;
判断n是否小于0,是,返回NULL;
记录下根结点的值(后序的最后一个为根节点)r=(post+n-1);
b=new BTNode;给b一个空间作为,并赋值;
在mid中寻找根节点的值
for p=mid(mid的起始) to mid+n(mid的终);
并记录下中序中根节点的下标 k=p-mid;
利用递归构造左子树和右子树
b->lchild=CreateBT(post,mid,k); b->rchild=CreateBT(post+k,p+1,n-k-1);
最后返回b;
}
原理:1. 根据后序序列的最后一个元素建立根结点;2. 在中序序列中找到该元素,确定根结点的左右子树的中序序列;3. 在后序序列中确定左右子树的后序序列;4. 由左子树的后序序列和中序序列建立左子树;5. 由右子树的后序序列和中序序列建立右子树。
2.3 代码截图
2.4 PTA提交列表说明
- 一开始写的post和mid的指针类型为char而不是int,导致在提交的时候会出现部分正确第一个测试点和最后一个测试点段错误可能是因为char所用的内存比int大而题目就规定好了内存的大小,所以char不行!
2.1 题目3:6-4 jmu-ds-表达式树
2.2 设计思路
建表达式二叉树:
定义树栈 s1 存储数字
定义字符型栈 s2 存储运算符
‘#’入栈s2;
将#进op栈
while 表达式未结束
{ if str 不为运算符
将后续的数字存到s栈中
else
switch(Precede(op栈顶运算符,str))
{ case '<' 栈顶运算符优先级低
op.push(str)
从str中读取下一个字符
break;
case '='
只有两个括号满足这个情况
从str读取下一个字符
break;
case '>' 栈s运算符执行
建立结点
s.push( );
break;
}
}
while op顶不为 '#'
从s中取两个结点
s.push( );
break;
}
计算表达式树:
定义浮点型数 a b 存储运算数;
利用递归把所有字符转换成数字;
a,b分别存储树节点的左右子树;
while 树节点存在
if '+' 返回 a+b;
if'-' 返回 a-b;
if'' 返回ab;
if'/' if b不为0 返回a/b;
2.3 代码截图
2.4 PTA提交列表说明
- 一开始不会中缀表达式建树,导致每次建的树使用的内存都太大,然后在网上找了其他人的建树代码来看,发现自己有很多地方都是多余的删了后,又改了改自己定义的变量的类型,就过了。
3.截图本周题目集的PTA最后排名
3.1 PTA排名
3.2 我的得分:205
4. 阅读代码(必做,1分)
这篇代码是构建哈夫曼树的代码,书本上写的是利用ht数组来记录节点的孩子和双亲,而这篇代码直接构造了一棵链式储存的哈夫曼树,对于7-7的修理牧场来说,只需先构建一个哈夫曼树,在把不是叶子节点的节点data加起来就是题目的答案,思路简单,但是构建哈夫曼的代码对我来说只能借鉴,无法自己打出来。地址:https://blog.csdn.net/move_now/article/details/53398753.