DS博客作业05--树
1.本周学习总结
1.思维导图
2.学习体会
树的学习,从前面的线性结构突然到了非线性结构,感觉更加抽象了,难度也大了不少,对于课本上的概念还有一些算法,认真预习看书后也还是可以理解,但真的要打pta就感觉是另外一回事了,就算上课听了老师的思路去打还是有些吃力,有些不知从哪下手
2.PTA实验作业
2.1.题目1:7-1 还原二叉树
2.1.1设计思路
#include<iostream>
#include<string.h>
using namespace std;
int GetHigh(char *preorder,char *inorder,int n );
int main()
{
char preorder[50];
char inorder[50]; //定义两个字符数组存放中序和前序序列;
int n;
int High;
cin>>n; //输入结点个数;
cin>>preorder>>inorder; //分别输入前序序列和中序序列;
High=GetHigh(preorder,inorder,n); //调用函数求二叉树的高度;
cout<<High;
return 0;
}
int GetHigh(char *preorder,char *inorder,int n)
{
int i,a,b;
if(n==0)
{
return 0;
} //判断树是否为空,如果为空则返回0;
for(i=0;i<n;i++)
if(preorder[0]==inorder[i]) //判断出根结点所在的位置后跳出循环
break;
a=1+GetHigh(preorder+1,inorder,i);
b=1+GetHigh(preorder+i+1,inorder+i+1,n-1-i); //递归分别求出左右子树的高度;
return a>b?a:b; //返回树的高度
}
2.1.2代码截图
2.1.3PTA提交列表及说明
Q1:没有考虑树为空的情况出现了段错误
Q2:改了段错误后还是有最后一个测试点不过,后边认真审题后发现是数组的大小不够,题目要求N<=50
2.2.题目2:7-2 根据后序和中序遍历输出先序遍历
2.2.1设计思路
#include<iostream>
using namespace std;
typedef struct node *BinTree;
struct node
{
int data;
BinTree left;
BinTree right;
};
typedef struct node btNode;
BinTree CreatTree(int *lateorder,int *inorder,int n ); //建树函数;
void PrintBinTree(BinTree BT); //输出函数;
int main()
{
int n,i;
cin>>n;
int lateorder[30];
int inorder[30];
for(i=0;i<n;i++)
cin>>lateorder[i];
for(i=0;i<n;i++)
cin>>inorder[i]; //定义两个数组存放后序序列和中序序列;
BinTree BT=CreatTree(lateorder,inorder,n); //根据后序序列和中序序列建树;
cout<<"Preorder:";
PrintBinTree(BT); //调用函数输出前序序列
return 0;
}
BinTree CreatTree(int *lateorder,int *inorder,int n )
{
if(n==0)return NULL; //判断树是否为空;
int i;
for(i=0;i<n;i++)
if(inorder[i]==lateorder[n-1])
break; //找到根结点,跳出循环;
BinTree BT= new btNode; //动态分配空间;
BT->data=lateorder[n-1];
BT->left=CreatTree(lateorder,inorder,i);
BT->right=CreatTree(lateorder+i,inorder+i+1,n-i-1); //递归建立左右子树
return BT;
}
void PrintBinTree(BinTree BT)
{
if(!BT)return;
cout<<" "<<BT->data; //前序输出树的每一个结点
if(BT->left)PrintBinTree(BT->left);
if(BT->right)PrintBinTree(BT->right);
return;
}
2.2.2代码截图
2.2.3PTA提交列表及说明
Q1:在输出前面没加“preorder”,出现各种错误,改了之后还是部分正确;
Q2:数组大小不足,最后一个测试点没过,把数组大小改成30就过了
2.3.题目3:6-3 求二叉树高度
2.3.1设计思路
int GetHeight( BinTree BT)
{
int m,n; //定义m,n来存放左右子树的高度;
if(BT==NULL)
return 0; //判断树是否为空;
else
{
m=GetHeight(BT->Left); //递归求左子树的高度
n=GetHeight(BT->Right); .//递归求右子树的高度
if (m>n)
return(m+1);
else //判断左右子树的高度后返回树的高度
return(n+1);
}
}
2.3.2代码截图
2.3.3PTA提交列表及说明
3.阅读代码
3.1题目[Leetcode] Sum root to leaf numbers求根到叶节点的数字之和
3.2解题思路
遇到空节点,说明其没有左右孩子了,而且对应的值为0;遇到一般节点,则由sum直接加上当前节点的值;遇到叶节点,说明递归到最底端了,本次的递归结束,返回sum
3.3代码截图
3.4学习体会
通过这个题目的学习,我更深切体会到了递归在树这一块的重要性,几乎处处都有用到递归,建树,遍历,几乎每一个操作都用,而且要根据会遇到不同的情况构造递归条件,比如这个题目中在遍历结点时如何处理空结点,一般结点,叶结点。