首页 > 其他分享 >代码随想录第16天:513.找树左下角的值、112. 路径总和、106.从中序与后序遍历序列构造二叉树

代码随想录第16天:513.找树左下角的值、112. 路径总和、106.从中序与后序遍历序列构造二叉树

时间:2024-08-24 17:21:46浏览次数:11  
标签:right TreeNode int 随想录 二叉树 new 左下角 root left

513.找树左下角的值,层序遍历

// 找树左下角的值,用层序遍历很容易实现
#include <iostream>
#include <queue>

struct TreeNode
{
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

// 找到最底层最左边节点的值
int findBottomLeftValue(TreeNode *root)
{
    if (root == nullptr)
    {
        return 0; // 如果树为空,返回0(根据实际情况定义)
    }

    std::queue<TreeNode *> queue;
    queue.push(root);

    int result = 0;
    while (!queue.empty())
    {
        int levelSize = queue.size();
        for (int i = 0; i < levelSize; ++i)
        {
            TreeNode *currentNode = queue.front();
            queue.pop();

            // 如果是当前层的第一个节点,则更新结果
            if (i == 0)
            {
                result = currentNode->val;
            }

            // 将当前节点的子节点加入队列
            if (currentNode->left != nullptr)
            {
                queue.push(currentNode->left);
            }
            if (currentNode->right != nullptr)
            {
                queue.push(currentNode->right);
            }
        }
    }

    return result;
}

int main()
{
    // 构建一个简单的二叉树作为例子
    TreeNode *root = new TreeNode(1);
    root->left = new TreeNode(2);
    root->right = new TreeNode(3);
    root->left->left = new TreeNode(4);
    root->left->right = new TreeNode(5);
    root->right->right = new TreeNode(6);
    root->right->right->left = new TreeNode(7);

    // 找到最底层最左边节点的值
    std::cout << "Bottom left value: " << findBottomLeftValue(root) << std::endl;

    return 0;
}

112. 路径总和

// 路径总和
#include <iostream>

struct TreeNode
{
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

// 辅助函数,用于递归检查路径和
bool hasPathSum(TreeNode *node, int sum)
{
    if (node == nullptr)
    {
        return false; // 如果节点为空,直接返回 false
    }

    // 检查当前节点是否是叶子节点,并且剩余路径和是否为当前节点值
    if (node->left == nullptr && node->right == nullptr)
    {
        return sum == node->val;
    }

    // 递归检查左子树和右子树
    return hasPathSum(node->left, sum - node->val) || hasPathSum(node->right, sum - node->val);
}

// 主函数,判断树中是否存在目标路径和
bool HasPathSum(TreeNode *root, int targetSum)
{
    return hasPathSum(root, targetSum);
}

int main()
{
    // 构建一个简单的二叉树作为例子
    TreeNode *root = new TreeNode(5);
    root->left = new TreeNode(4);
    root->left->left = new TreeNode(11);
    root->left->left->left = new TreeNode(7);
    root->left->left->right = new TreeNode(2);
    root->right = new TreeNode(8);
    root->right->left = new TreeNode(13);
    root->right->right = new TreeNode(4);
    root->right->right->right = new TreeNode(1);

    // 判断是否存在路径和为 22 的路径
    bool result = HasPathSum(root, 22);
    std::cout << "Exist path sum 22? " << (result ? "Yes" : "No") << std::endl;

    return 0;
}

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


#include <iostream>
#include <vector>
#include <unordered_map>

using namespace std;

struct TreeNode
{
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

TreeNode *traversal(vector<int> inorder, vector<int> posorder)
{
    if (posorder.size() == 0)
        return NULL;

    int rootValue = posorder[posorder.size() - 1];
    TreeNode *root = new TreeNode(rootValue);

    int delimiterIndex;
    for (delimiterIndex = 0; delimiterIndex < inorder.size(); delimiterIndex++)
    {
        if (inorder[delimiterIndex] == rootValue)
            break;
    }

    // 切割中序数组
    vector<int> leftInorder(inorder.begin(), inorder.begin() + delimiterIndex);
    vector<int> rightInorder(inorder.begin() + delimiterIndex + 1, inorder.end());

    posorder.resize(posorder.size() - 1);

    // 切割后序数组
    vector<int> leftPosorder(posorder.begin(), posorder.begin() + leftInorder.size());
    vector<int> rightPosorder(posorder.begin() + leftInorder.size(), posorder.end());

    root->left = traversal(leftInorder, leftPosorder);
    root->right = traversal(rightInorder, rightPosorder);

    return root;
}

TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder)
{
    if (inorder.size() == 0 || postorder.size() == 0)
        return NULL;
    return traversal(inorder, postorder);
}

void printPreorder(TreeNode *node)
{
    if (node == nullptr)
    {
        return; // 如果节点为空,则返回
    }

    std::cout << node->val << " "; // 首先打印根节点的值
    printPreorder(node->left);     // 递归打印左子树
    printPreorder(node->right);    // 递归打印右子树
}

int main()
{
    std::vector<int> inorder = {9, 3, 15, 20, 7};
    std::vector<int> postorder = {9, 15, 7, 20, 3};
    TreeNode *root = buildTree(inorder, postorder);

    printPreorder(root);
    std::cout << std::endl;
    return 0;
}

标签:right,TreeNode,int,随想录,二叉树,new,左下角,root,left
From: https://blog.csdn.net/weixin_48850397/article/details/141502002

相关文章

  • 二叉树的前序遍历(递归和非递归)
    /***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;*TreeNode():val(0),left(nullptr),right(nullptr){}*TreeNode(intx):val(x),left(nullptr),right(nullptr){}*......
  • LeetCode-Python-1650. 二叉树的最近公共祖先 III
    给定一棵二叉树中的两个节点 p 和 q,返回它们的最近公共祖先节点(LCA)。每个节点都包含其父节点的引用(指针)。Node 的定义如下:classNode{publicintval;publicNodeleft;publicNoderight;publicNodeparent;}根据维基百科中对最近公共祖先节点......
  • 代码随想录day39 || 198 打家劫舍,213 打家劫舍||,337 打家劫舍|||
    198打家劫舍funcrob(nums[]int)int{ //思路,动态规划 //dp[i]代表前下标为i能装的最大盗窃物品价值 //递推dp[i]=max(dp[i-1],dp[i-2]+v(i))//dp[i-1]代表不偷物品i,dp[i-2]+v(i)代表偷物品i,那么就不能偷i-1,因为题目要求不能相邻,所以考虑前i-2 //dp[0]=0,......
  • 「代码随想录算法训练营」第四十五天 | 图论 part3
    目录101.孤岛的总面积DFS思路BFS思路102.沉没孤岛103.水流问题104.建造最大岛屿101.孤岛的总面积题目链接:https://kamacoder.com/problempage.php?pid=1173文章讲解:https://programmercarl.com/kamacoder/0101.孤岛的总面积.html题目状态:看题解DFS思路思路:代码结构......
  • 代码随想录Day24
    93.复原IP地址有效IP地址正好由四个整数(每个整数位于0到255之间组成,且不能含有前导0),整数之间用'.'分隔。例如:"0.1.2.201"和"192.168.1.1"是有效IP地址,但是"0.011.255.245"、"192.168.1.312"和"[email protected]"是无效IP地址。给定一个只包含数字的字符串s......
  • 二叉树的先序遍历
    二叉树先序遍历(按照根-左-右次序访问节点)以下图为例:先序遍历序列应为:12489510367分别用递归算法和非递归算法得到上述例子的先序遍历序列(这里采用先序+为叶子节点添加‘-1’作为孩子节点来唯一确定一棵二叉树,非递归代码中,注意遍历过的结点加入栈中,这样当遍历完左子树......
  • 代码随想录算法训练营第 50 天 |98. 所有可达路径
    代码随想录算法训练营Day50代码随想录算法训练营第50天|98.所有可达路径目录代码随想录算法训练营前言LeetCode98.所有可达路径一、图论基础概念1、图的种类2、度3、连通性:节点的连通情况4、图的构造5、图的遍历方式二、深度优先搜索1、深度优先搜索的三部曲2......
  • 代码随想录算法训练营第 51 天 |LeetCode99岛屿数量 LeetCode100.岛屿的最大面积
    代码随想录算法训练营Day51代码随想录算法训练营第51天|LeetCode99岛屿数量LeetCode100.岛屿的最大面积目录代码随想录算法训练营前言LeetCode200岛屿数量LCR105.岛屿的最大面积一、广度优先搜索基础1、用队列实现2、代码框架:二、卡码网99岛屿数量(LeetCode......
  • 代码随想录算法训练营第 49 天 |LeetCode42 接雨水 LeetCode84 柱状图中最大面积矩形
    代码随想录算法训练营Day49代码随想录算法训练营第49天|LeetCode42接雨水LeetCode84柱状图中最大面积矩形目录代码随想录算法训练营前言LeetCode42接雨水LeetCode84柱状图中最大面积矩形一、LeetCode42接雨水1.题目链接2.思路3.题解二、LeetCode84柱状......
  • 代码随想录算法训练营第 48 天 |LeetCode 739. 每日温度 LeetCode496.下一个更大元素
    代码随想录算法训练营Day48代码随想录算法训练营第48天|LeetCode739.每日温度LeetCode496.下一个更大元素ILeetCode503.下一个更大元素II目录代码随想录算法训练营前言LeetCode739.每日温度LeetCode496.下一个更大元素ILeetCode503.下一个更大元素II一......