随想录一刷Day18——二叉树
创始人
2024-04-07 12:10:30
0

文章目录

  • Day18_二叉树
    • 16. 找树左下角的值
    • 17. 路径总和
    • 18. 从中序与后序遍历序列构造二叉树

Day18_二叉树

16. 找树左下角的值

513. 找树左下角的值
思路1:递归法(前序遍历)

记录遍历到的最大深度,记录该深度下第一个遍历到的元素值,不断更新结果至遍历完所有的结点,即找到最大值。

class Solution {
public:int MaxDepth = -1;int result = INT_MAX;void tranversal(TreeNode* root, int Depth) {if (root->left == NULL && root->right == NULL) {if (Depth > MaxDepth) { // 大于是为了保证最深层的result是最左结点的值MaxDepth = Depth;result = root->val;}return ;}if (root->left) tranversal(root->left, Depth + 1);if (root->right) tranversal(root->right, Depth + 1);return ;}int findBottomLeftValue(TreeNode* root) {// 题目要求是至少有一个结点,即不存在第一节点为空的情况tranversal(root, 0);return result; }
};

思路2:迭代法(层序遍历)

层序遍历记录每层的第一个元素,答案为最后一层的第一个元素

class Solution {
public:int findBottomLeftValue(TreeNode* root) {// 题目要求是至少有一个结点,即不存在第一节点为空的情况int result;queue que;que.push(root);while (!que.empty()) {int que_size = que.size();for (int i = 0; i < que_size; i++) {TreeNode* node = que.front();que.pop();if (i == 0) result = node->val;if (node->left) que.push(node->left);if (node->right) que.push(node->right);}}return result;}
};

17. 路径总和

112. 路径总和
思路:

先序遍历,在叶子节点处判断路径和是否满足条件

class Solution {
public:bool ans_flag = false;void tranversal(TreeNode* root, int sum) {if (ans_flag) return ;if (root->left == NULL && root->right == NULL) { // 到叶子节点再判断是否满足if (sum == 0) {ans_flag = true;}return ;}if (root->left) tranversal(root->left, sum - root->left->val);if (root->right) tranversal(root->right, sum - root->right->val);}bool hasPathSum(TreeNode* root, int targetSum) {if (root == NULL) return false;tranversal(root, targetSum - root->val);return ans_flag;}
};

精简递归的写法

class Solution {
public:bool hasPathSum(TreeNode* root, int targetSum) {if (root == NULL) return false;if (!root->left && !root->right && targetSum == root->val) return true;return hasPathSum(root->left, targetSum - root->val) | hasPathSum(root->right, targetSum - root->val);}
};

利用栈模拟递归回溯

class Solution {
public: // 先序遍历bool hasPathSum(TreeNode* root, int targetSum) {if (root == NULL) return false;stack> stk;stk.push(pair(root, root->val));while (!stk.empty()) {pair node = stk.top();stk.pop();if (!node.first->left && !node.first->right && node.second == targetSum) return true; // 中if (node.first->right) stk.push({node.first->right, node.second + node.first->right->val}); // 右if (node.first->left) stk.push({node.first->left, node.second + node.first->left->val}); // 左}return false;}
};

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

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

根据中序和后续的遍历顺序特点,互相配合构造出二叉树
后续遍历 左 右 中,最后一个元素作为当前子树的根节点
中序遍历 左 中 右,子树的根结点左边为左子树值,右边为右子树值
反复递归划分区间,直到区间大小全部划分为1,回溯构造二叉树

class Solution {
private:TreeNode* tranversal(vector inorder, vector postorder) {if (postorder.size() == 0) return NULL;// 后序遍历数组中的最后一个元素作为当前的子树的根int root_value = postorder[postorder.size() - 1];TreeNode* root = new TreeNode(root_value);// 左右递归至只有一个元素,子树的建立完成if (postorder.size() == 1) return root;// 找到中序遍历的切割点int divide_index;for (int i = 0; i < inorder.size(); i++) {if (inorder[i] == root_value) {divide_index = i;break;}}// 切割中序遍历数组,左闭右开vector leftInorder(inorder.begin(), inorder.begin() + divide_index);vector rightInorder(inorder.begin() + divide_index + 1, inorder.end());// posterorder 舍弃末尾元素postorder.resize(postorder.size() - 1);// 切割后续数组,左闭右开,由于遍历顺序导致中序和后续前一部分都是左子树的遍历结果,所以后续和中序划分方式相同vector leftPosterorder(postorder.begin(), postorder.begin() + divide_index);vector rightPosterorder(postorder.begin() + divide_index, postorder.end());root->left = tranversal(leftInorder, leftPosterorder);root->right = tranversal(rightInorder, rightPosterorder);return root;}public:TreeNode* buildTree(vector& inorder, vector& postorder) {if (inorder.size() == 0) return NULL;return tranversal(inorder, postorder);}
};

相关内容

热门资讯

《长江干线安徽至四川段船舶航行... 转自:中国水运网5月9日,记者从长江海事局获悉,《长江干线安徽至四川段船舶航行规则》(简称《规则》)...
青岛打造创业孵化4.0版本 高... 转自:中工网原标题:青岛打造创业孵化4.0版本 高能级创业孵化园区建设跑出“加速度”工人日报-中工网...
天风证券定增获上交所审核通过 ...   炒股就看金麒麟分析师研报,权威,专业,及时,全面,助您挖掘潜力主题机会!   5月9日,天风证...
中国政府援缅第十三批紧急人道主... 中国政府向缅甸提供的第十三批紧急人道主义地震救灾物资5月9日运抵仰光。10日,中国驻缅甸大使馆参赞欧...
“走读中国” 内蒙古行即将启幕... 来源:环球网 由国家互联网信息办公室网络传播局指导,中国公共外交协会、环球网主办,内蒙古自治区互联网...
政策“组合拳”持续稳健有效 中... 转自:央视网央视网消息: 人力资源社会保障部日前公示第七批新职业、新工种。其中,拟增加17个新职业,...
麦芽糊精商品报价动态(2025... 生意社05月10日讯 交易商品牌/产地交货地最新报价麦芽糊精 固体山东宇硕化工有限公司...
“科创板八条”政策效应持续释放... 转自:经济日报5月9日,上交所官网信息显示,宁波健信超导科技股份有限公司(简称“健信超导”)的科创板...
转扩!外省籍小客车周末游广西,... 自治区交通运输厅联合发展改革委、财政厅日前印发《关于做好小客车周末自驾游广西高速公路通行优惠提振消费...
中共辽宁省营口市委常委、宣传部... 转自:新华财经5月9日,2025世界品牌莫干山大会“草坪故事会”在浙江德清风光秀丽的莫干山脚下展开。...
唯一被认可作用是减少风阻?魏建... (图片来源:摄图网)传统门把手通常是一个外露的把手,安装在车门的外侧,方便乘客直接握住并拉动车门。而...
活性炭颗粒状商品报价动态(20... 生意社05月10日讯 交易商品牌/产地交货地最新报价活性炭颗粒状 煤质3-5mm碘值9...
加强文学交流 赓续中俄友好 “伟大的俄罗斯作家列夫·托尔斯泰在《战争与和平》中写道:‘历史是国家和人类的传记。’历史的记忆和真相...
肖峰读《从塞北到西域》︱拉铁摩... [美]欧文·拉铁摩尔著,王敬译,上海人民出版社︱光启书局2024年5月出版,414页,108.00元...
假消息!印度军方否认S-400... 格隆汇5月10日|印度外交部和军方举行联合发布会。印度军方发言人表示,巴基斯坦试图持续进行恶意的虚假...
16楼“飞”出电竞椅,原因查明... 转自:北京日报客户端据四川成都市公安局高新技术产业开发区分局消息近日成都高新区某小区发生了一起高空抛...
以数观势|稳预期 强信心 激活... 转自:中国台湾网  面对全球经济波动,中国经济如何稳预期、强信心、激活力?今年以来,围绕支持科技创新...
济宁城际公交集团C619、B6... C619、B6、J967线路临时绕行2025年汶上半程马拉松将于2025年5月11日(星期日)上午举...
雕白粉商品报价动态(2025-... 生意社05月10日讯 交易商品牌/产地交货地最新报价 雕白粉 工业级,含量98%,粉末...
今日谈:永远不能忘却的纪念 原标题:永远不能忘却的纪念(今日谈)  80年前的伟大胜利打败了不可一世的法西斯势力,带给世人恒久的...