【计划执行报告】Day9 04-08 在校庆124周年被二叉树暴虐

Day9 04-08 在校庆124周年被二叉树暴虐

今天是:

  1. 计划执行的第9
  2. 124周年校庆
  3. 机器学习结课的一天

1.今日动态

  1. 校庆日&机器学习结课之日我的相关书籍也到来了,我发誓这是最后一波淘书了!!!

在这里插入图片描述

2.计划执行报告

2.1近期计划(03-31-04-12)

  1. 《机器学习中的数学》前三章(线性代数相关)
    2.完成专业课的作业(流体机械能转化、生物质能,新能源热利用可以往后稍稍);
    3.备战蓝桥杯,为此:①利用中午1h左右的时间补充数据结构知识(优先Leetcode“探索”模块);②C/C++语法知识;③常见数据结构的构造与基本操作实现;④必要的练习与练题总结(比如时长1:30虚拟竞赛与“覆盘”)

2.2今日计划表

04-08

2.3实际时间分配

  1. 二叉树仅仅做出了3题,耗时太久(上午2小时一道题没弄出来,我太菜了);
  2. 中午、下午接连领了波快递,把节奏搞乱了;
  3. 从时间分配也能看出来,近两天的学习热情有点被消磨掉了,需要好好调整下。
图1 时间分配
图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;
    }
};

【明日计划】

04-09

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章