DS博客园作业05--树

1.本周学习总结(0--1分)

1.思维导图

2.学习体会

树的知识比较抽象,学起来比较困难。我在战略上出现失误,现在越来越跟不上老师的步伐了,很多作业都没有完成,我正在思索怎么解决。
原本以为写完大作业后pta的题目就会打了,看来我还是太天真,问题的难度往往超过我的想象。

2.1.题目1:题目名称

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

2.1.1设计思路

#include<iostream>
using namespace std;
#include<stdlib.h>
typedef struct BTree{
	char data;
    struct BTree *Left;
    struct BTree *Right;
    int weight;
}BT; 
typedef struct BTree* Tree; 
void CreatTree(Tree &root,char*name,int weight,int i);//用于建树 
void SumTree(Tree root,int&sum);//用于计算树 
int main()
{
	int sum=0;
	char name[50];
	for(int j=0;j<50;j++)//初始化 
	{
		数组name初始化
	}
	name[49]='\0';
    Tree root; 
    cin>>name;
    CreatTree(root,name,0,1);//建树 
    if(root==NULL)//树为空输出0 
    {
    	 输出0
    }
    SumTree(root,sum);//计算树 
    cout<<sum;//输出数据 
    return 0;
}
void CreatTree(Tree &root,char*name,int weight,int i)//构建树 
{
	if(name为#或者‘\0’)
	{
		该节点为空
		return;
	}
	else
	{
		初始化节点,对节点赋值
		CreatTree(root->Left,name,weight+1,2*i);//用递归接着建树 
		CreatTree(root->Right,name,weight+1,2*i+1);
	}
	return;
}
void SumTree(Tree root,int&sum)
{
	  if(root==NULL)
	    return;
	  else
	  {
	  	 if(是叶子节点) 
	  	 {
	  	 	计算数据
	  	 	return;
		 }
		 SumTree(root->Left,sum);//运用递归遍历树,同时进行计算 
		 SumTree(root->Right,sum);
	  }
} 

2.1.2代码截图

2.1.3本题PTA提交列表说明。

Q1:没理解题目
A1:一开始采用层次遍历建树,遇到了很大困难,最后利用数据建的顺序存储关系建树,解决问题。之后做题没有认真审题,在空树时输出0.

2.2 题目2

2.1.题目1:题目名称 6-3 求二叉树高度 (20 分)

2.1.2代码截图

2.1.3本题PTA提交列表说明。

本题没什么难度,直接解决

2.3 题目3

7-3 jmu-ds-二叉树层次遍历 (25 分)

2.3设计思路

#include<iostream>
using namespace std;
#include<stdlib.h>
#include<queue>
typedef struct BTree{
	char data;
    struct BTree *Left;
    struct BTree *Right;
}BT; 
typedef struct BTree* Tree; 
void CreatTree(Tree &root,char*name,int i);//用于建树 
void CoutTree(Tree root);//用于输出树 
int flag=0;
int main()
{
	int sum=0;
	char name[50];
	for(int j=0;j<50;j++)//初始化 
	{
		数组初始化
	}
	name[49]='\0';
    Tree root; 
    cin>>name;
    CreatTree(root,name,1);//建树 
    if(root==NULL)//树为空输出0 
    {
    	cout<<"NULL";
    	return 0;
	}
    CoutTree(root);
    return 0;
}
void CreatTree(Tree &root,char*name,int i)//构建树 
{
	if((*(name+i)=='#')||(*(name+i)=='\0'))
	{
		root=NULL;
		return;
	}
	else
	{      
                初始化树
		CreatTree(root->Left,name,2*i);//用递归接着建树 
		CreatTree(root->Right,name,2*i+1);
	}
	return;
}
void CoutTree(Tree root)//输出树 
{
	int flag=0;
	if(root==NULL)
	   return;
    queue <Tree>Q;
    Tree OutQ;
    Q.push(root);
    while(!Q.empty())//运用层次遍历输出树 
    {
    	运用层次遍历输出树
	return;
}

2.3代码截图




2.3pta提交列表及说明

Q1:出现很多错误,有一个测试点老是无法通过
A1:原因在于我没有认真审题,一开始题目说层次遍历输出数据,结果我用层次遍历建树,用先序遍历输出数组,总之题目不难,我却因为审题的问题耽误了很多时间。

代码阅读

题目

设计思路

给定两个二叉树,编写一个函数来检验它们是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

代码截图

学习体会

本题用递归的方法遍历每个节点,一个一个进行比较,最后得出结论。一开始我以为算法很复杂,因为要核对树中的每个数据,同时比较树的结构,最后发现用递归可以解决问题
本题还有的一种思路是:先序列化为字符串,再比较两个字符串是否相等。 函数 serialize 的作用就是将一颗二叉树采用前序遍历的递归方式序列化成一个字符串,例如二叉树 [1,2,3] 将序列化为 '1!2!#!#!3!#!#!'

posted @ 2019-05-18 22:01  1112+  阅读(221)  评论(0编辑  收藏  举报