代码随想录打卡第十六天

2024-07-06 1638阅读

代码随想录–二叉树部分

day16 二叉树第四天

代码随想录打卡第十六天
(图片来源网络,侵删)

文章目录

  • 代码随想录--二叉树部分
  • 一、力扣513--找树左下角的值
  • 二、力扣112--路径总和
  • 三、力扣106--从中序与后序遍历序列构造二叉树

    一、力扣513–找树左下角的值

    代码随想录题目链接:代码随想录

    给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。

    假设二叉树中至少有一个节点。

    层序遍历秒了,没什么好讲的

    代码如下:

    class Solution {
    public:
        int findBottomLeftValue(TreeNode* root) {
            queue que;
            que.push(root);
            vector temp;
            while(!que.empty())
            {
                int length = que.size();
                for(int i = 0; i left) que.push(curr->left);
                    if(curr->right) que.push(curr->right);
                    if(i == 0) temp.push_back(curr->val);
                }
            }
            return temp[temp.size()-1];
        }
    };
    

    递归法的话,需要回溯,递归到最底层后再判断是否为最左边的节点。

    class Solution {
    public:
        int maxDepth = INT_MIN;
        int result;
        void traversal(TreeNode* root, int depth) {
            if (root->left == NULL && root->right == NULL) {
                if (depth > maxDepth) {
                    maxDepth = depth;
                    result = root->val;
                }
                return;
            }
            if (root->left) {
                depth++;
                traversal(root->left, depth);
                depth--; 
            }
            if (root->right) {
                depth++;
                traversal(root->right, depth);
                depth--; 
            }
            return;
        }
        int findBottomLeftValue(TreeNode* root) {
            traversal(root, 0);
            return result;
        }
    };
    

    二、力扣112–路径总和

    代码随想录题目链接:代码随想录

    给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。

    叶子节点 是指没有子节点的节点。

    可以类似二叉树的所有路径方式写一个回溯,然后计算每个path的总和

    代码如下:

    class Solution {
    public:
        bool traversal(TreeNode * curr, vector & path, int targetSum)
        {
            if(!curr->left && !curr->right)
            {
                int sum = 0;
                for(auto ele : path)
                {
                    sum += ele;
                }
                if(sum + curr->val == targetSum) return true;
                else return false;
            }
            if(curr->left)
            {
                path.push_back(curr->val);
                if(traversal(curr->left, path, targetSum)) return true;
                path.pop_back();
            }
            if(curr->right)
            {
                path.push_back(curr->val);
                if(traversal(curr->right, path, targetSum)) return true;
                path.pop_back();
            }
            return false;
        }
        bool hasPathSum(TreeNode* root, int targetSum) {
            vector path;
            if(!root) return false;
            return traversal(root, path, targetSum);
        }
    };
    

    附加题:力扣113–路径总和Ⅱ

    遍历所有路径时加个判断即可,如果通过就把当前的path加入result,注意要把当前节点的val加入path后再进result,进完需要把当前节点的val再pop出来,不然会影响回溯

    class Solution {
    public:
        void traversal(TreeNode * curr, vector path, int targetSum, vector &result)
        {
            if(!curr->left && !curr->right)
            {
                int sum = 0;
                for(auto ele : path) sum += ele;
                sum += curr->val;
                if(sum == targetSum) 
                {
                    path.push_back(curr->val);
                    result.push_back(path);
                    path.pop_back();
                }
            }
            if(curr->left)
            {
                path.push_back(curr->val);
                traversal(curr->left, path, targetSum, result);
                path.pop_back();
            }
            if(curr->right)
            {
                path.push_back(curr->val);
                traversal(curr->right, path, targetSum, result);
                path.pop_back();
            }
            
        }
        vector pathSum(TreeNode* root, int targetSum) {
            if(!root) return {};
            vector path;
            vector result;
            traversal(root, path, targetSum, result);
            return result;
        }
    };
    

    三、力扣106–从中序与后序遍历序列构造二叉树

    代码随想录题目链接:代码随想录

    给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。

    如何通过中序和后序构建二叉树参考链接讲解

    这个题的递归也比较清晰,取后序的最后一位,用其对中序分割,再返回来分割后序,从而能够递归构建左右子树

    难点在于怎么分割

    代码如下:

    class Solution {
    public:
        TreeNode* traversal(vector inorder, vector postorder)
        {
            if(!inorder.empty() && !postorder.empty())
            {
                TreeNode * curr = new TreeNode(postorder[postorder.size()-1]);
                if(postorder.size() == 1) return curr;
                int delimiterIndex;
                for (delimiterIndex = 0; delimiterIndex left = traversal(leftInorder, leftPostorder);
                curr->right = traversal(rightInorder, rightPostorder);
                return curr;   
            }
            return nullptr;
        }
        TreeNode* buildTree(vector& inorder, vector& postorder) {
            if(inorder.empty() || postorder.empty()) return nullptr;  
            // this can be delete cause traversal() can deal with it
            return traversal(inorder, postorder);
        }
    };
    

    想起来了vector分割可以用

    vector X(vectorB.begin(), vectorB.end());
    

    来创建一个指定的vector,不需要自己去遍历插入

    附加题:力扣105–从前序与中序遍历序列构造二叉树

    不同于106,本题要用前序遍历的首节点去分割,剩下思路一样

    代码如下:

    class Solution {
    public:
        TreeNode * traversal(vector& preorder, vector& inorder)
        {
            if(preorder.empty() || inorder.empty()) return nullptr;
            TreeNode * curr = new TreeNode(preorder[0]);
            if(preorder.size() == 1) return curr;
            int diff = 0;
            for(diff = 0; diff left = traversal(leftPreorder, leftInorder);
            curr->right = traversal(rightPreorder, rightInorder);
            return curr;
        }
        TreeNode* buildTree(vector& preorder, vector& inorder) {
            return traversal(preorder, inorder);
        }
    };
    
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]