1.本周学习总结
1.思维导图
2.谈谈你对树结构的认识及学习体会。
2.PTA实验作业
这两周学习了树与二叉树,它与前几章学习的内容有很大的不同,前几章学习的线性表,栈与队列等都是线性的存储结构,而这一章学习的“树”是非线性存储结构的。但是,树的存储结构还是可以通过找到元素之间逻辑关系,采用类似线性表的方式,按照结点之间的逻辑关系放到线性存储中。
2.1题目一:6-4 jmu-ds-表达式树
输入一行中缀表达式,转换一颗二叉表达式树,并求解.
表达式只包含+,-,*,/,(,)运算符,操作数只有一位,且为整数(有兴趣同学可以考虑负数小数,两位数做法)。按照先括号,再乘除,后加减的规则构造二叉树。
2.1.1设计思路
void InitExpTree(BTree& T, string str) //建二叉表达式树
{
建立char类型容器
建立BTree类型容器
建立BTree类型变量t1,t2
建立int类型变量i=0
while str[i]不为空
if(str[i])为运算符
判断两个运算符的优先关系,分别进行操作
else
建立二叉树
end while
while st不为空
进行操作
end while
}
double EvaluateExTree(BTree T)//计算表达式树
{
if T->data不为零
进行相应操作
else
return T->data - '0'
}
2.1.2代码截图
2.1.3本题PTA提交列表说明。
2.2 题目2: 还原二叉树
给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。
2.2.1设计思路
建立结构体bt
bt *findTree(char *a, char *b, int length)
{
if(length==0)
return NULL
end if
用递归建树
T->lchild = findTree(a, b + 1, i);
T->rchild = findTree(a + i + 1, b + i + 1, length
}
int GetHeight(bt *T)
{
if(NULL==0)
return 0
end if
else
求左孩子与右孩子的高度
}
2.2.2代码截图
2.2.3本题PTA提交列表说明。
编译错误?
在对递归的使用不熟,导致频繁出错。
部分正确?
对于一些可能的情况没有考虑完全,有些也不知道如何解决。
2.3 题目3:二叉树叶子结点带权路径长度和
二叉树叶子结点的带权路径长度指:叶子结点的权重路径长度。本题要求算出二叉树所有叶子结点的带权路径长度和。
2.3.1设计思路
CreateBT(string str,int i)
if 下标越界||字符为‘#’||树为空
return NULL;
end if
bt->lchild=递归调用建树函数,下标为2*i;
bt->rchild=递归调用建树函数,下标为2*i+1;
}
void GetWpl(BinTree bt,int h,int &wpl ){ //求长度和
if 树为空
return ;
end if
if 该结点是叶子节点 then
路径长wpl=叶子节点的权重*层数;
end if
运用递归
查找左孩子的叶子节点,层数+1;
查找右孩子的叶子节点,层数+1;
}
2.3.2代码截图
2.3.3本题PTA提交列表说明。
在建立求总长度的函数中,最后判断条件应该是左指针和右指针都为空,但我写成左指针或右指针为空,导致部分正确,还有在一个地方判断条件写错,导致出现段错误。
3.阅读代码
3.1 题目:扩展二叉树
由于先序、中序和后序序列中的任一个都不能唯一确定一棵二叉树,所以对二叉树做如下处理,将二叉树的空结点用·补齐,如图所示。我们把这样处理后的二叉树称为原二叉树的扩展二叉树,扩展二叉树的先序和后序序列能唯一确定其二叉树。
现给出扩展二叉树的先序序列,要求输出其中序和后序序列。