DS博客作业05-树

DS博客作业05-树

1.本周学习总结

1.思维导图

1475633-20190525152649181-1456060397.png

2.学习体会

     对于这章,我感觉在课前预习时,看书做课堂派觉得自己挺懂,老师上课讲的也大概能理解,但一到做题就不知所措,很迷茫,然后很多题也不会做。难道看书还是太疏忽了?没记住哪些算法吗?也许是新知识太多了,还有感觉这两周老师上课上得挺快得,还没从树中走出来,图就快完了,然后新得一章又来了(-_-)!唉!找时间看书消化消化吧!

2.PTA实验作业

2.1题目一:6-4 jmu-ds-表达式树

输入一行中缀表达式,转换一颗二叉表达式树,并求解.
表达式只包含+,-,*,/,(,)运算符,操作数只有一位,且为整数(有兴趣同学可以考虑负数小数,两位数做法)。按照先括号,再乘除,后加减的规则构造二叉树。
如图所示是"1+(2+3)*2-4/5"代数表达式对应二叉树,用对应的二叉树计算表达式的值。 转换二叉树如下:

2.1.1设计思路(伪代码)

void InitExpTree(BTree &T, string str)  //建表达式的二叉树
{
        stack<BTree> s;   //存放结点的栈
        stack<char> op;    //存放操作符
        op.push('#');          //以#结束
         while(str[i]!='\0')    //遍历数组str
      {
         if(!In(str[i]) )  //操作数;
                 {
                       建立树结点,并让树进栈;
                 }
                 else
        {
                       先判断操作栈是否空
                       再比较数组和栈顶的大小关系
                       根据大小关系做相应的操作
                 }
          }
          while(op.top() !='#')    
            {
                       遍历栈
                       根据关系,找左孩子和右孩子,建树
            }
}
double EvaluateExTree(BTree T)//计算表达式树
{
          if (!T->lchild && !T->rchild)
        return T->data - '0';         
            value1 = EvaluateExTree(T->lchild);          //递归口,让式子从叶子结点开始计算;
        value2 = EvaluateExTree(T->rchild);
            switch (T->data)      遍历树
    {    
                 case '+':      
                case '-':
        case '*':     做相应的计算,并返回式子的结果
        case '/':
        }
}

2.1.2代码截图

1475633-20190525095533797-1430325216.png
1475633-20190525095546969-327352017.png
1475633-20190525095600464-1473251612.png

2.1.3提交列表及说明

1475633-20190524214334169-420970378.png

  • Q1:段错误
  • A1:在比较数组和栈顶时忘记判断栈是否空了。
  • Q2:编译错误
  • A2:在编译器上打代码,不小心把全部代码复制过去了。
  • Q3:答案错误
  • A3:在对栈做处理时,粗心大意,顺序弄反了。

2.2题目二:7-4 jmu-ds-二叉树叶子结点带权路径长度和 (25 分)

二叉树叶子结点的带权路径长度指:叶子结点的权重路径长度。本题要求算出二叉树所有叶子结点的带权路径长度和。 如下面的二叉树:

2.2.1设计思路(伪代码)

BTree CreatTree(string str,int i)
{
       定义树的结构变量bt
       当i>len-1或str[i]='#'
        返回NULL
       申请结点BTNode
       将str[i]的值赋给bt->data
       递归调用函数CreatTree构建左右孩子
       返回bt
}
void GetWPL(BTree bt,int h,int &wpl)
{
      判断树是否空,如果树为空,返回NULL
      如果左右孩子均不为空
      wpl+=bt->data-'0'乘以所在层数
      递归调用函数GetWpl,其中的h+1,得到所在层数 
}

2.2.2代码截图

1475633-20190525104555068-1733564702.png
1475633-20190525104610212-2022780831.png
2.2.3提交列表及说明
1475633-20190525104644565-79094927.png

  • Q1:编译错误
  • A1:没注意到编译器的语法改变。
  • Q2:段错误
  • A2:在比较i 和Len 时,以为直接return也可以,后面发现少了NULL不可以。

2.3题目三:7-5 jmu-ds-输出二叉树每层节点 (22 分)

~~
层次遍历树中所有节点。输出每层树节点。
树结构按照树的先序遍历递归建树,比如先序遍历字符串“ABD#G###CEH###F#I##”#代表空节点。对应树结构如下图,
~~~

2.3.1设计思路(伪代码)

BinTree CreatBT(string str,int &i)
{
        当i>len-1或str[i]='#'
         返回NULL
        定义树的结构变量BT
        申请结点BTNode
        将str[i]的值赋给BT->data
        递归调用函数CreatTree构建左右孩子
        返回bt
 }
void Print(BinTree BT) 
{
       定义树的结构变量curNode,lastNode
       flag==1,表示该层输出完成,level表示该结点第几层
       把树赋给curNode,lastNode,然后让树中的结点进栈 
       遍历栈,对头赋给curNode,判断为左孩子还是右孩子或者与lastNode相等,进行相应的赋值 
       用flag控制树层
       最后输出栈顶
}

2.3.2代码截图

1475633-20190525134810174-444146696.png
1475633-20190525134820964-1155081903.png
1475633-20190525134832727-848096697.png

2.3.3提交列表及说明

1475633-20190525134953040-918398015.png

  • Q1:部分正确
  • A1:对结点层数及该层所有结点的输出格式混乱
  • A2:用flag控制输出格式

3.阅读代码

3.1题目

给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例:
输入: [1,2,3,null,5,null,4]
输出: [1, 3, 4]
解释:

   1            <---
 /   \
2     3         <---
 \     \
  5     4       <---

3.2解题思路

用bfs算法对二叉树进行层序遍历,保存每层的最后一个节点

3.3代码截图

1475633-20190525141545523-1491337428.png

3.4学习体会

bfs算法为广度优先搜索(横向)。class是将数据与方法封装,让行为与数据一致的编程方法。与struct相同而又不同,class的成员默认是private,权限,struct默认是public权限。经百度得知integer是整型的意思,但C++里只有int,没有这个数据类型,但在java里有,且它是一个类, 是对象类型int的1原始类型。

转载于:https://www.cnblogs.com/Gejkdj/p/10891682.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
赫夫曼是一种特殊的二叉树,它的每个叶子节点都表示一个字符,并且每个字符对应的编码都是唯一的。赫夫曼常用于数据压缩。 赫夫曼的编码方式是按照前缀编码进行编码,即一个字符的编码不能是另一个字符编码的前缀。例如,如果字符 A 的编码是 10,那么字符 B 的编码不能是 1,因为这个编码是字符 A 的前缀。 赫夫曼的解码方式是从根节点开始遍历,根据编码的 0 或 1 分别选择左子或右子,直到到达叶子节点,找到对应的字符。 下面是一个赫夫曼的例子: ``` /\ / \ / \ /\ /\ / \ / \ a b c d ``` 假设字符 a 的编码为 0,字符 b 的编码为 10,字符 c 的编码为 110,字符 d 的编码为 111。那么,编码串 010110111 可以被解码成字符串 "abcbd"。 具体的解码过程如下: 1. 从根节点开始遍历,根据第一个字符 0,选择左子。 2. 继续遍历左子,根据第二个字符 1,选择右子。 3. 继续遍历右子,根据第三个字符 0,选择左子。 4. 到达叶子节点,找到字符 a。 5. 回到根节点,根据第四个字符 1,选择右子。 6. 继续遍历右子,根据第五个字符 1,选择右子。 7. 继续遍历右子,根据第六个字符 0,选择左子。 8. 到达叶子节点,找到字符 b。 9. 回到根节点,根据第七个字符 1,选择右子。 10. 继续遍历右子,根据第八个字符 1,选择右子。 11. 到达叶子节点,找到字符 d。 12. 回到根节点,根据第九个字符 1,选择右子。 13. 继续遍历右子,根据第十个字符 1,选择右子。 14. 到达叶子节点,找到字符 c。 15. 读取完所有的字符,解码完成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值