代码改变世界

第04次作业-树

2018-05-05 20:13  黑鹰1096  阅读(472)  评论(0编辑  收藏  举报

1.学习总结

1.1树结构思维导图

 

 

1.2 树结构学习体会

树是一种非线性结构,其定义是递归为主。

根据先序遍历、中序遍历、后序遍历确定唯一二叉树;二叉树,树,森林间的相互转化;将二叉树线索化;找出哈夫曼树,求解节点的哈夫曼编码;利用并查集求解等价问题;

2.PTA实验作业

本周要求挑选出3道题目书写设计思路、调试过程。设计思路使用伪代码描述。题目选做要求:

  • 如果选6-1,只需要描述建树的伪代码。
  • 6-4必选

具体书写内容及格式如下:


2.1 题目1:

6-2 求二叉树高度

本题要求给定二叉树的高度。

函数接口定义:

int GetHeight( BinTree BT );

其中BinTree结构定义如下:

typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};

要求函数返回给定二叉树BT的高度值。

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>

typedef char ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};

BinTree CreatBinTree(); /* 实现细节忽略 */
int GetHeight( BinTree BT );

int main()
{
    BinTree BT = CreatBinTree();
    printf("%d\n", GetHeight(BT));
    return 0;
}
/* 你的代码将被嵌在这里 */

输出样例(对于图中给出的树):

4

2.2 设计思路(伪代码或流程图)

求二叉树高度的递归模型f(b)如下:

当 b = NULL;

f(b)=0

当b!= NULL

f(b)=Max{f(b->child),f(b->rchild)}+1;

 

2.3 代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)

2.4 PTA提交列表说明。

这串代码与书上的第172页的求高度的一样但由于我的粗心没有把题目看清,把lchild与rchild改为Lift与Right


2.1 题目2:

7-1 还原二叉树(25 分)

给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。

输入格式:

输入首先给出正整数N(≤50),为树中结点总数。下面两行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区别大小写)的字符串。

输出格式:

输出为一个整数,即该二叉树的高度。

输入样例:

9
ABDFGHIEC
FDHGIBEAC

输出样例:

 5

2.2 设计思路(伪代码或流程图)

采用递归算法;

 

若b==NULL

f(b,x)= NULL

当b->data==x;

f(b,x) = b

若左子树中找到了,即p = f(b->lchild,x)且片!=NULL

f(b,x) = p

其他情况下 f(b,x) = f(b->rchild,x);

TreeNode*findTree(char*in,char*pre,int length)  

用上述的查找节点的函数进行对应的递归算法就可以了

2.3 代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)

2.4 PTA提交列表说明。

 

编译错误是因为没有查找的过程,之后问同学就告诉我要有查节点这一步骤

2.1 题目3:

6-4 jmu-ds-表达式树(25 分)

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

表达式二叉树.png

输入要求

输入一行字符串

输出要求

输出结算结果,如遇到除0,提示divide 0 error!

函数接口定义:

void InitExpTree(BTree &T,string str) ; //建表达式的二叉树
double EvaluateExTree(BTree T);//计算表达式树

T:二叉树 str:输入的表达式

裁判测试程序样例:

#include<iostream>
#include<string>
#include<stack>
using namespace std;
typedef struct BiTNode{                             //二叉树的二叉链表存储表示
	char data;
	struct BiTNode *lchild,*rchild;
}BTNode,*BTree;
void InitExpTree(BTree &T,string str) ; //建二叉表达式树 
double EvaluateExTree(BTree T);//计算表达式树 
char Precede(char t1,char t2) ;//比较t1,t2运算符优先级函数 
int In(char c) ;//判断c是否运算符 
void CreateExpTree(BTree &T,BTree a,BTree b,char ch);//建简单二叉树 
void DestroyBTree(BTree bt);//销毁树 
int main() 
 {
   string str;
   BTree T;
   getline(cin,str);
   InitExpTree(T,str);          //创建表达式树
   cout<<EvaluateExTree(T);             //输出值
    DestroyBTree(T);
   return 0;
 }
char Precede(char t1,char t2) 
 { /*判断两符号的优先关系 */
   char f;
    switch(t2)
   {
     case '+':if(t1=='('||t1=='#')
                f='<';
              else
                f='>';
              break;
     case '-':if(t1=='('||t1=='#')
                f='<';
              else
                f='>';
              break;
     case '*':if(t1=='*'||t1=='/'||t1==')')
                f='>';
              else
                f='<';
              break;
	case '/':if(t1=='*'||t1=='/'||t1==')')
                f='>';
              else
                f='<';
              break;
	case '(':if(t1!=')')
                f='<';
              break;
	case')':if(t1=='(')
				f='=';
				else
					f='>';
				break;
	case'#':if(t1=='#')
				f='=';
		else
			f='>';
   }
   return f;
 }
int In(char c) 
 { /* 判断c是否为运算符 */
   switch(c)
   {
   case '+':
   case'-':
   case'*':
	case '/':
   case'#':
   case '(':
   case')':return 1;break;
   default:return 0;
   }
 }
void CreateExpTree(BTree &T,BTree a,BTree b,char ch){           //简单二叉树的创建
	T=new BTNode;
	T->data=ch;
	T->lchild=a;
	T->rchild=b;
}
void DestroyBTree(BTree bt)//销毁树
{
	if(bt!=NULL)
	{
	  DestroyBTree(bt->lchild);
	  DestroyBTree(bt->rchild);
	  delete bt;	
	}
}
/* 请在这里填写答案 */

输入样例:

1+2*3

输出样例:7

2.3 代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)

 

2.4 PTA提交列表说明。

该怎么做都不知道就只能抄同学的

 

3.截图本周题目集的PTA最后排名

3.1 PTA排名截图

 

 

3.2 我的总分:

本题评分规则:

1.5分

4. 阅读代码(必做)

代码相关地址:http://www.cnblogs.com/NeilHappy/archive/2013/04/04/2999050.html

优点: 在这里看到了这个题。层次遍历是用队列,一级一级地入队列然后输出。而用递归的话,我首先想到是用两个栈来模拟队列,在递归遍历二叉树的过程中入栈,然后最后一次性出栈。但仔细思考后发现无法做到层次遍历。在这里看到了正确的方法。

 

5. 代码Git提交记录截图