【计划执行报告】Day9 04-08 在校庆124周年被二叉树暴虐
Day9 04-08 在校庆124周年被二叉树暴虐
今天是:
- 计划执行的第9天
- 124周年校庆
- 机器学习结课的一天
1.今日动态
- 校庆日&机器学习结课之日我的相关书籍也到来了,我发誓这是最后一波淘书了!!!
2.计划执行报告
2.1近期计划(03-31-04-12)
- 《机器学习中的数学》前三章(线性代数相关)
2.完成专业课的作业(流体机械能转化、生物质能,新能源热利用可以往后稍稍);
3.备战蓝桥杯,为此:①利用中午1h左右的时间补充数据结构知识(优先Leetcode“探索”模块);②C/C++语法知识;③常见数据结构的构造与基本操作实现;④必要的练习与练题总结(比如时长1:30虚拟竞赛与“覆盘”)
2.2今日计划表
2.3实际时间分配
- 二叉树仅仅做出了3题,耗时太久(上午2小时一道题没弄出来,我太菜了);
- 中午、下午接连领了波快递,把节奏搞乱了;
- 从时间分配也能看出来,近两天的学习热情有点被消磨掉了,需要好好调整下。
3.关于我校庆日被二叉树虐这档事
昨天多快乐今天就多自闭。上午两小时原计划完成4题,结果整天下来就做出了3题,我觉得还是得调整下思路,有些东西不能强求全部自己想,想个20min没构思出来的话就看看提示吧。总之,时间宝贵,不能头铁!
下面我仅把做过的题目以及我的通过的解答列出来,等系统学完后再抽时间单独总结,毕竟现在自己尚未进入Leetcode的“伟大航路”。
习题1
根据后序遍历数组确定根节点,然后在中序遍历数组中找到根节点的位置,其前后就分别对应左子树和右子树,然后依次递归下去。
class Solution {
public:
int find(vector<int> v,int s,int t,int key){
for(int i=s;i<=t;i++)
if(v[i]==key)
return i;
return -1;
}
TreeNode* buildSubTree(vector<int> inorder,
vector<int> postorder,int inS,int inT,int postT){
if(inS>inT){//子树为空
return NULL;
}
int rootval=postorder[postT];//根节点值
TreeNode* root=new TreeNode(rootval);//创建树
root->left=NULL;
root->right=NULL;
//获取根节点在中序序列的下标
int root_pos=find(inorder,inS,inT,rootval);
int left_end=postT-(inT-root_pos)-1;
int right_end=postT-1;//右子树根节点位置
root->left=buildSubTree(inorder,postorder,inS,
root_pos-1,left_end);
root->right=buildSubTree(inorder,postorder,
root_pos+1,inT,right_end);
return root;
}
TreeNode* buildTree(vector<int>& inorder,
vector<int>& postorder) {
return buildSubTree(inorder,postorder,0,
inorder.size()-1,postorder.size()-1);
}
}
习题2
思路与上题差不多。
class Solution {
public:
int find(vector<int> v,int s,int t,int key){
for(int i=s;i<=t;i++)
if(key==v[i])
return i;
return -1;
}
TreeNode* buildSubTree(vector<int> preorder,
vector<int> inorder,int preS,int inS,int inT) {
if(inS>inT)
return NULL;
int root_val=preorder[preS];
TreeNode* root=new TreeNode(root_val);
int root_pos=find(inorder,inS,inT,root_val);
root->left=buildSubTree(preorder,inorder,
preS+1,inS,root_pos-1);
root->right=buildSubTree(preorder,inorder,
preS+root_pos-inS+1,root_pos+1,inT);
return root;
}
TreeNode* buildTree(vector<int>& preorder,
vector<int>& inorder) {
return buildSubTree(preorder,inorder,
0,0,inorder.size()-1);
}
};
注意,要还原一个二叉树,所给的两种遍历序列中一定要有中序遍历。
习题3
这个是满二叉树,所以实现起来不难。
class Solution {
public:
void sub_connect(Node* nl,Node* nr) {
if(!nl)
return;
if(nr){//根节点连接
nl->next=nr;
sub_connect(nr->left,nr->right);
sub_connect(nl->right,nr->left);
}
sub_connect(nl->left,nl->right);
}
Node* connect(Node* root) {
sub_connect(root,NULL);
return root;
}
};