首页 > 编程语言 >算法随想Day16【二叉树】| LC513-找树左下角的值、LC112-路径总和、LC106-从中序与后序遍历序列构造二叉树

算法随想Day16【二叉树】| LC513-找树左下角的值、LC112-路径总和、LC106-从中序与后序遍历序列构造二叉树

时间:2023-02-19 00:55:37浏览次数:42  
标签:LC112 int root nullptr que 二叉树 左下角 inorder postorder

LC513. 找树左下角的值

这道题用层次遍历,更容易做

int findBottomLeftValue(TreeNode* root)
{
    int result = 0;
    int size = 0;
    queue<TreeNode*> que;
    TreeNode* curr = nullptr;
    if (root != nullptr)
    {
        que.push(root);
    }
    while (que.empty() != true)
    {
        size = que.size();
        result = que.front()->val;
        for (int i = 0; i < size; i++)
        {  
            curr = que.front();
            que.pop();
            if (curr->left != nullptr)
            {
                que.push(curr->left);
            }
            if (curr->right != nullptr)
            {
                que.push(curr->right);
            }
        }
    }
    return result;
}

记录下错误:

开始没定义size,直接写为for (int i = 0; i < que.size(); i++),这是一段错误的代码,因为for内对queue进行的push和pop操作都会影响其size()值,这里很容易忽略出错

LC112. 路径总和

递归做法一次通过,递归回溯时,再拼接当前节点在前面

class Solution
{
public:
    int flag;
    void checkPathSum(TreeNode* root, int sum, int& targetSum)
    {
        if (root != nullptr) return;  //力扣非要加多这一句才给通过,不理解
        sum += root->val;
        if (root->left == nullptr && root->right == nullptr)
        {
            //sum += root->val;
            if (targetSum == sum)
            {
                flag = true;
            }
            return ;
        }
        checkPathSum(root->left, sum, targetSum);
        checkPathSum(root->right, sum, targetSum);
    }
    bool hasPathSum(TreeNode* root, int targetSum)
    {
        int sum = 0;
        flag = false;
        if (root == nullptr)
        {
            return false;
        }
        checkPathSum(root, sum, targetSum);
        return flag;
    }
};

总结思考:

  • 回溯,左右子树不相干的递归(LC112. 路径总和、LC257. 二叉树的所有路径):用前序,先处理中,终止条件为if (root->left == nullptr && root->right == nullptr),后面左右子树分别递归,两者平行不相干。
  • 左右子树不相干的递归(LC404. 左叶子之和,LC110. 平衡二叉树):回溯时,当前节点的总值会跟左右两子树都相关,可能是相加之和sum = leftsum + rightsum + (root->left == nullptr && root->right == nullptr && is_left == 1 ? root->val : 0),也可能是两者比较if (abs(leftheight - rightheight) > 1)。

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

递归的函数,传参传的是值,而不是地址,所以内存消耗比较大。其实可以传引用,然后用指针(索引下标)标明每层对两个数组的操作范围的话,应该可以省下些内存。

class Solution
{
public:
    TreeNode* buildTreeLoop(vector<int> inorder, vector<int> postorder)
    {
        int count = 0;
        int curr_val = postorder[postorder.size() - 1];
        TreeNode* root = new TreeNode(curr_val);
        ////开始写了这个判断,作为递归终止条件,后面添加下面两个if判断,遂可以省去这个
        // if (postorder.size() == 1)
        // {
        //     return root;
        // }
        auto it = find(inorder.begin(), inorder.end(), curr_val);
        for (auto i = inorder.begin(); i != it; i++)
        {
            ++count;
        }
        ////这两个if判断不能丢,否则可能导致指针访问越界
        if (it != inorder.begin())  //当it指向inorder.begin()时,说明当前节点已经没有左子树
            root->left = buildTreeLoop(vector<int>(inorder.begin(), it), vector<int>(postorder.begin(), postorder.begin() + count));
        if (it != inorder.end() - 1)  //当it指向inorder.end() - 1时,说明当前节点已经没有右子树
            root->right = buildTreeLoop(vector<int>(it + 1, inorder.end()), vector<int>(postorder.begin() + count, postorder.end() - 1));
        return root;
    }
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder)
    {
        return buildTreeLoop(inorder, postorder);
    }
};

标签:LC112,int,root,nullptr,que,二叉树,左下角,inorder,postorder
From: https://www.cnblogs.com/Mingzijiang/p/17134095.html

相关文章

  • 代码随想录算法训练营第十八天【二叉树】513.找树左下角的值、112.路径总和、113.路径
    513.找树左下角的值112.路径总和113.路径总和ii106.从中序与后序遍历序列构造二叉树105.从前序与中序遍历序列构造二叉树 ......
  • 二叉树
    1.二叉树遍历a.前序遍历对于二叉树的任意一个节点,先打印该节点,然后是它的左子树,最后右子树b.中序遍历对于二叉树的任意一个节点,先打印它的......
  • 二叉树||二叉树的遍历||排序二叉树||二分查找
    二叉树根节点叶子节点:左叶子节点右叶子节点树的层级树的高度二叉树的遍历广度优先遍历一层一层对节点进行遍历深度优先遍历前序:根......
  • 【LeetCode二叉树#01】二叉树的遍历(递归/迭代)
    二叉树递归遍历写递归算法时候需要遵循的三个点:确定递归函数的参数和返回值:确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数,并且还要明确每次递......
  • 【LeeCode】二叉树理论
    二叉树分类没有数值满⼆叉树如果⼀棵⼆叉树只有度为0的结点和度为2的结点,并且度为0的结点在同⼀层上,则这棵⼆叉树为满⼆叉树​满⼆叉树,也可以说深度为k,有2^k-1个节点的⼆叉......
  • 代码随想录算法训练营Day18 二叉树
    代码随想录算法训练营代码随想录算法训练营Day18二叉树|513.找树左下角的值112.路径总和113.路径总和ii106.从中序与后序遍历序列构造二叉树105.从前序与中序遍历......
  • lc二叉树中序遍历
    94.二叉树的中序遍历给定一个二叉树的根节点root,返回它的中序遍历。示例1:输入:root=[1,null,2,3]输出:[1,3,2]示例2:输入:root=[]输出:[]示例3:输入:root=[1]输出......
  • 算法随想Day15【二叉树】| LC110-平衡二叉树、LC257-二叉树的所有路径、LC404-左叶子
    LC110.平衡二叉树递归做法一次通过,其实也就是对比:某个节点的左子树和右子树的最大深度的绝对值不大于1,即可认为是平衡二叉树classSolution{public:boolflag;......
  • 【LeetCode二叉树#00】二叉树的基础知识
    基础知识分类满二叉树如果二叉树中除了叶子结点,每个结点的度都为2,则此二叉树称为满二叉树。完全二叉树除了底层外,其他部分是满的,且底层从左到右是连续的,称为完全二......
  • 为什么mysql 要用B+树而不用二叉树
          1.B+树的层级更少B+树的高度一般为2-4层,所以查找记录时最多只需要2-4次IO,相对二叉平衡树已经大大降低了。范围查找时,能通过叶子节点的指针获......