代码随想录打卡Day16

今天有点忙,先写一题,剩下的明天再补。

找树左下角的值

这个题目我直接用迭代法做的,主要就是遍历二叉树,用一个二维向量v将所有节点保存起来,然后v中最后一个向量的第一个值就是树左下角的值了。再去看视频以后感觉用递归做确实会很难,我也没有完全搞懂,先这样吧。
这是我的代码。

class Solution {
public:
    int findBottomLeftValue(TreeNode* root) {
        queue<TreeNode*> My_Queue;
        vector<vector<int>> v;
        if(root) My_Queue.push(root);
        while(!My_Queue.empty()){
            int size = My_Queue.size();
            vector<int> temp;
            while(size > 0){
                TreeNode* node = My_Queue.front();
                My_Queue.pop();
                temp.push_back(node -> val);
                if(node -> left) My_Queue.push(node -> left);
                if(node -> right) My_Queue.push(node -> right);
                size--;
            }
            v.push_back(temp);
        }
        return v[v.size() - 1][0];
    }
};

剩下的明天再说。


今天是8月30日,把昨天欠的两道题补上。

112. 路径总和

这个没思路,直接看视频的。这道题目我感觉以我的能力不能直接用一个函数解决,于是我重新写了个函数。这道题需要在主函数中对根节点为空的特殊情况进行单独处理,如果主函数不为空的话,说明二叉树中至少有一个节点,然后再调用自己写的函数。思路还是参考卡尔的思路。

class Solution {
public:
    bool hasPathSum(TreeNode* root, int targetSum) {
        if(root == NULL) return false; 
        targetSum -= root -> val;
        return Traversal(root, targetSum);
    }
    bool Traversal(TreeNode* root, int targetSum){ //调用该函数时默认传入指针不为空
        TreeNode* node = root;
        if(node -> left == NULL && node -> right == NULL && targetSum == 0)
            return true;
        if(node -> left == NULL && node -> right == NULL && targetSum != 0)
            return false;
        
        if(node -> left){
            targetSum -= node -> left -> val;
            if(Traversal(node -> left, targetSum)) return true;
            targetSum += node -> left -> val;
        }
        if(node -> right){
            targetSum -= node -> right -> val;
            if(Traversal(node -> right, targetSum)) return true;
            targetSum += node -> right -> val;
        }
        return false;
    }
};

106. 从中序与后序遍历序列构造二叉树

这道题目确实很难,在两个数组不断分割迭代那里有点费解,看完视频以后写了挺久的,写完了以后提交代码,还在201个测试用例那里超时了,无语。。。。原因是我在分割后序遍历的向量时,是通过不断查找传入后序遍历向量中的值是否在传入的left_in中,每一次查找都耗费了时间,所以最后超时了,后面想到可以直接用left_in的大小直接定位到左右子树的分界点,然后可以直接一步到位,节约了很多时间。

class Solution {
public:
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        if(postorder.size() == 0) return NULL;
        TreeNode* node = new TreeNode(postorder[postorder.size() - 1]);  //取出根节点
        vector<vector<int>> son_intree = split_inorder(inorder, node -> val);  //左中序,右中序
        vector<vector<int>> son_postree = split_postorder(postorder, son_intree[0]);  //左后序,右后序
        node -> left = buildTree(son_intree[0], son_postree[0]);
        node -> right = buildTree(son_intree[1], son_postree[1]);
        return node;
    }
    vector<vector<int>> split_inorder(vector<int> inorder, int root_val){
        int index;
        for(index = 0; index < inorder.size(); index++){
            if(inorder[index] == root_val)
                break;
        }
        vector<int> left_in(inorder.begin(), inorder.begin() + index);
        vector<int> right_in(inorder.begin() + index + 1, inorder.end());
        return {left_in, right_in};
    }
    vector<vector<int>> split_postorder(vector<int> postorder, vector<int> left_in){
        int index = left_in.size();
        vector<int> left_post(postorder.begin(), postorder.begin() + index);
        vector<int> right_post(postorder.begin() + index, postorder.end() - 1);
        return {left_post, right_post};
    }
};

最后AC了,但是时间复杂度和空间复杂度还是很大。。无语。。。。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值