当前位置: 首页 > news >正文

【笔试训练】给一个数组构建二叉树|从前序遍历与中序遍历构建二叉树|二叉树中的最大路径和

文章目录

  • 1.给一个数组构建二叉树
  • 2.从前序遍历和中序遍历构建二叉树
  • 3.二叉树中的最大路径和


1.给一个数组构建二叉树

思路:就是借助一个队列实现层序遍历的思想。
先将root节点入队列,构造左右节点后,root取出来时,将其左右孩子都入队列。

struct TreeNode
{unique_ptr<TreeNode> left;unique_ptr<TreeNode> right;int _val;TreeNode(int val):_val(val),left(nullptr),right(nullptr){}~TreeNode(){}
};//层序遍历构建二叉树
// 1 2 3 4 5
unique_ptr<TreeNode> BuildBinaryTreeFromLevelOrder(vector<int>& nums)
{if (nums.size() == 0){cout << "nums is empty!" << endl;}unique_ptr<TreeNode> root = make_unique<TreeNode>(nums[0]);queue<TreeNode*> q;q.push(root.get());int i = 1;while (!q.empty() && i < nums.size()){TreeNode* cur = q.front();q.pop();//先处理左子树cur->left = make_unique<TreeNode>(nums[i]);q.push(cur->left.get());i++;//再处理右子树if (i < nums.size()){cur->right = make_unique<TreeNode>(nums[i]);q.push(cur->right.get());}i++;}return root;
}

2.从前序遍历和中序遍历构建二叉树

从前序遍历和中序遍历构建二叉树

在这里插入图片描述

思路:

  • 1.根据前序遍历的根,先找到中序遍历的根节点所在下标。
  • 2.然后划分成两个区间进行递归即可。

注意事项:
previ是前序中的根节点下表,用来构建当前节点的。
所以构建完根节点后, 需要++previ,到达左子树的根节点。
并且要传引用。否则回到当前递归栈这一层时,会从原位置开始向下走

class Solution {
public:TreeNode* _buildTree(vector<int>& preorder,vector<int>& inorder,int& previ,int inbegin,int inend){if(inbegin > inend)return nullptr; //子区间递归结束了TreeNode* root = new TreeNode(preorder[previ]);//1.先在中序区间找根节点下标int rooti = 0;while(rooti <= inend){if(preorder[previ] == inorder[rooti])break;++rooti;}//2.分成左右子区间分别构建子树。++previ; //根节点的下一个节点就是左子树的根了root->left = _buildTree(preorder,inorder,previ,inbegin,rooti-1);//这里不要再++prei,因为递归构建左子树时,会自己++prei,构建左子树的最后//一个节点时,会先++prei,就到右子树了。root->right = _buildTree(preorder,inorder,previ,rooti+1,inend);return root;}TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {//根据前序遍历的根,先找到中序遍历的根节点所在下标。//然后划分成两个区间进行递归即可。int previ = 0; //传参时一定是传引用,否则回到当前递归栈这一层时//会从原位置开始向下走int inbegin = 0,inend = inorder.size()-1;return _buildTree(preorder,inorder,previ,inbegin,inend);}
};

3.二叉树中的最大路径和

二叉树中的最大路径和
在这里插入图片描述

思路:二叉树中一条路的最大路径和一定是该节点的左子树的最大有效值与右子树的最大有效值的最大值的和,再加上当前节点的值。
所以:

  • 1.先求出左右子树的最大有效值,再加上当前节点的值。
  • 2.求有效值的过程,不断更新最大路径和。

这里注意两个概念:

  • 1.最大贡献值是因为左子树可能有几十条路径,需要选出最优的路径,才是最大的贡献。
    左右子树的最大贡献值加起来,再加上我当前节点的值之后,才组成最大路径和(左右都是最优的路径)。我的左子树和右子树两条路径选出来,比较后,选最大的,再加上我当前节点的值,然后向上交付,就能组成一条最优的路径。
  • 2.最大路径和就是:左右子树的最大贡献值,加上我当前节点的值,就组成了一条完整的路径。

别看这道题是困难题,如果想明白了后序遍历,就一点不难。

class Solution {int max_val = INT_MIN; //保存最大的路径和
public:int _paxPathSum(TreeNode* root){if(root == nullptr)return 0; //空节点的有效值为0//保存左右子树的最大贡献值int left_con = max(_paxPathSum(root->left),0);int right_con = max(_paxPathSum(root->right),0);//更新最大路径和max_val = max(max_val,left_con + right_con + root->val);//返回贡献值return root->val + max(left_con,right_con);}int maxPathSum(TreeNode* root) {_paxPathSum(root);return max_val;}
};

相关文章:

  • 用生活例子通俗理解 Python OOP 四大特性
  • 【2025最新】Vm虚拟机中直接使用Ubuntu 免安装过程直接使用教程与下载
  • kubuntu系统详解
  • Pycharm中No Conda enviroment selected
  • 本地不安装oracle,还想连oracle
  • 001大模型-认识大模型以及大模型应用场景
  • 【数据结构】map_set前传:二叉搜索树(C++)
  • Qwen:Qwen3,R1 在 Text2SQL 效果评估
  • lenis滑动插件的笔记
  • c++ 类的成员初始化
  • Android 中 Handler (创建时)内存泄漏问题及解决方案
  • js滚动条保持在最底部的方法,场景:聊天室
  • 机架式服务器是什么?机架式/塔式/刀片式三大服务器类型区别与选型全解析
  • android studio开发aar插件,并用uniapp开发APP使用这个aar
  • 大模型数据分析破局之路20250512
  • std::move 和 std::forward
  • 2025年网站安全防御全解析:应对DDoS与CC攻击的智能策略
  • 如何使用快捷键打开 Microsoft Word 和其他 Windows 应用程序
  • Porting Linux to a new processor architecture, part 1: The basics
  • 2025年best好用的3dsmax插件和脚本
  • 美国三大指数全线高开:纳指涨逾4%,大型科技股、中概股大涨
  • 宇数科技王兴兴:第一桶金来自上海,欢迎上海的年轻人加入
  • 印巴冲突升级,巴基斯坦股市重挫7.29%,创5年来最大单日跌幅
  • 水利部:山西、陕西等地旱情将持续
  • 广州下调个人住房公积金贷款利率
  • 44岁街舞运动推广者、浙江省街舞运动协会常务理事钟永玮离世