LeetCode中二叉树相关题
Leetcode中二叉树相关题
二叉树相关的题相对来说还是比较简单的,都是套路
第一题
:求二叉树中最大路径和
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
示例 1:
输入: [1,2,3]1/ \2 3输出: 6
示例 2:
输入: [-10,9,20,null,null,15,7]-10/ \9 20/ \15 7输出: 42
这就是个后序遍历嘛
int ans = INT_MIN;
int oneSideMax(TreeNode* root) {if (root == nullptr) return 0;int left = max(0, oneSideMax(root->left));int right = max(0, oneSideMax(root->right));ans = max(ans, left + right + root->val);return max(left, right) + root->val;
}
C++代码:
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {public:int sum = INT_MIN;int maxPathSumchild(TreeNode* root){//递归出口if(root == nullptr){return 0;}//递归求 某个节点 的 左子树 和 右子树 的权值int left = max(0,maxPathSumchild(root->left));int right = max(0,maxPathSumchild(root->right));//检查是否需要更新创建新的路径,新路径的权值是left + right + root->val,最后更新sumsum = max(sum,(left + right + root->val));//递归返回 到当前节点的一条最大路径return max(left,right) + root->val;}int maxPathSum(TreeNode* root){maxPathSumchild(root);return sum;}
};
第二题
:根据前序遍历和中序遍历的结果还原⼀棵⼆叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:3/ \9 20/ \15 7
限制:
- 0 <= 节点个数 <= 5000
直接看代码:
TreeNode buildTree(int[] preorder, int preStart, int preEnd,int[] inorder, int inStart, int inEnd, Map<Integer, Integer> inMap) {if(preStart > preEnd || inStart > inEnd) return null;TreeNode root = new TreeNode(preorder[preStart]);int inRoot = inMap.get(root.val);int numsLeft = inRoot - inStart;root.left = buildTree(preorder, preStart + 1, preStart + numsLeft,inorder, inStart, inRoot - 1, inMap);root.right = buildTree(preorder, preStart + numsLeft + 1, preEnd,inorder, inRoot + 1, inEnd, inMap);return root;
}
这道题不难,看上一个例子就知道基本思想,重点是边界控制问题
根据下面9张图看一下例子当中二叉树的构建过程
2.
3.
4.
5.
6.
7.
8.
9.
C++代码:
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {public:TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {//递归分治//控制好边界,剩下的交给递归return recursionBuild(preorder.begin(),preorder.end(),inorder.begin(),inorder.end());}//递归分治TreeNode* recursionBuild(vector<int>::iterator preBegin, vector<int>::iterator preEnd, vector<int>::iterator inBegin, vector<int>::iterator inEnd ){if(inEnd==inBegin) return NULL;TreeNode* cur = new TreeNode(*preBegin);//在中序遍历数组中找前序遍历的第一个节点,最为中序数组的左右子树分界点auto root = find(inBegin,inEnd,*preBegin);//递归构造左右子树cur->left = recursionBuild(preBegin + 1,preBegin + (root - inBegin) + 1,inBegin,root);cur->right = recursionBuild(preBegin + 1 + (root - inBegin),preEnd,root + 1,inEnd);return cur;}
};
第三题
:恢复⼀棵 BST
二叉搜索树中的两个节点
被错误地交换。
请在不改变其结构的情况下,恢复这棵树。
示例 1:
输入: [1,3,null,null,2]1/3\2输出: [3,1,null,null,2]3/1\2
示例 2:
输入: [3,1,4,null,null,2]3/ \
1 4/2输出: [2,1,4,null,null,3]2/ \
1 4/3
这道题难点,是找到那两个交换节点,把它交换过来
就行了.
这里我们二叉树搜索树的中序遍历
(中序遍历遍历元素是递增的)
如下图所示, 中序遍历顺序是 4,2,3,1,我们只要找到节点4和节点1交换顺序
即可!
这里我们有个规律发现这两个节点:
第一个节点,是第一个按照中序遍历时候前一个节点大于后一个节点,我们选取前一个节点,这里指节点4;
第二个节点,是在第一个节点找到之后, 后面出现前一个节点大于后一个节点,我们选择后一个节点,这里指节点1;
void traverse(TreeNode* node) {if (!node) return;traverse(node->left);if (node->val < prev->val) {s = (s == NULL) ? prev : s;t = node;}prev = node;traverse(node->right);
}
first记录第一个被错误交换的节点指针
,second记录第二个被错误交换的节点指针
,prev记录在中序遍历中上一个被遍历到的节点指针
;
通过比较当前节点的值和上一个节点的值来判断其是否是first或者second
;注意:若被错误交换的两个节点在中序遍历中是相邻的两个节点
(相邻是指以相邻的顺序被遍历到),与不相邻的区别
;
完整代码:
class Solution {private:TreeNode* first = nullptr;//指向第一个错误的节点TreeNode* second = nullptr;//指向第二个错误的节点TreeNode* pre = new TreeNode(INT_MIN);//相对于当前节点在中序遍历下的上一个节点void helper(TreeNode* root){if(root == nullptr){return;}//中序遍历helper(root->left);//注意全程只有两个错误节点,所以下面的代码才可以那样写//找到第一个节点才可以继续找第二个错误节点,但是注意这两个节点并不一定是相邻的if(first == nullptr && pre->val > root->val){first = pre;}if(first != nullptr && pre->val > root->val){second = root;}pre = root;helper(root->right);}
public:void recoverTree(TreeNode* root) {helper(root);swap(first->val,second->val);}};
最后发现这不就是个中序遍历
嘛,
你看, Hard 难度的题⽬不过如此, ⽽且还这么有规律可循, 只要把框架写出来, 然后往相应的位置加东⻄就⾏了, 这不就是思路吗
LeetCode中二叉树相关题相关推荐
- Leetcode中二叉树中的搜索相关题目解析以及java实现
Leetcode中二叉树中的搜索相关题目解析以及java实现 这一类的题目其实稍微有一些杂,基本就是在二叉树中寻找一些或者某个特定值,题目比较多,我们会通过两道三篇来总结,不过总体来说也基本上就是BF ...
- LeetCode中二叉树题目总结
本文仅为博主个人总结,水平有限,欢迎大神指出不妥处. 来自 https://www.cnblogs.com/love-yh/p/7248136.html 关于二叉树的相关概念可以参见二叉树的百度 ...
- 视频教程-算法设计与编算法设计与编程实践---基于leetcode的企业真题库程实践-C/C++
算法设计与编算法设计与编程实践---基于leetcode的企业真题库程实践 夏曹俊:南京捷帝科技有限公司创始人,南京大学计算机硕士毕业,有15年c++跨平台项目研发的经验,领导开发过大量的c++虚拟仿 ...
- Leetcode每日必刷题库第80题,如何在不使用外部空间的情况下对有序数组去重?
LeetCode的第80题,有序数组去重II(Remove Duplicates from Sorted Array II). 这题的官方难度是Medium,通过率是43.3%,点赞1104,反对69 ...
- LeetCode:二叉树相关应用
LeetCode:二叉树相关应用 基础知识 617.归并两个二叉树 题目 Given two binary trees and imagine that when you put one of the ...
- 【LeetCode】第643题——子数组最大平均数I(难度:简单)
[LeetCode]第643题--子数组最大平均数I(难度:简单) 题目描述 解题思路 代码详解 注意点 题目描述 给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数. 示 ...
- 【LeetCode】第374题——猜数字大小(难度:简单)
[LeetCode]第374题--猜数字大小(难度:简单) 题目描述 解题思路 代码详解 注意点 题目描述 猜数字游戏的规则如下: 每轮游戏,我都会从 1 到 n 随机选择一个数字. 请你猜选出的是哪 ...
- 《算法设计编程实验:大学程序设计课程与竞赛训练教材》——2.4 相关题库...
2.4 相关题库 [2.4.1 Mileage Bank] [问题描述] ACM(Airline of Charming Merlion,迷人的鱼尾狮航空公司)的飞行里程计划对于经常要乘坐飞机的旅客非 ...
- 【LeetCode】第599题——两个列表的最小索引总和(难度:简单)
[LeetCode]第599题--两个列表的最小索引总和(难度:简单) 题目描述 解题思路 代码详解 注意点 题目描述 假设Andy和Doris想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的 ...
最新文章
- http响应头里没有或者有content-length的几种可能性
- 在Linux里使用dosbox运行debug.exe
- Vue.js学习系列(二十八)-- 计算属性(二)
- shell脚本中取消高亮显示_Linux中强大的top命令
- IPV6迎来商业元年 运营商短期盈利模式成难点
- cobalt strick 4.0 系列教程(6)Payload Artifact 和反病毒规避
- 丹琦女神新作:对比学习,简单到只需要Dropout两下
- java web 不用框架_MyShop-不用框架的基础javaweb项目
- python3.6,--登录知乎
- 2020年开发者大会资料和武大定量遥感视频分享(部分)
- 破解密码——利用粘滞键漏洞破解Windows 7 PIN
- matlab 平滑曲线连接_如何使用Affinity Designer for mac编辑矢量曲线和形状
- 阿里飞天分布式操作系统
- c# 定义四边形_C# 绘制多边形
- 惠普计算机进入安全模式,Windows10系统惠普电脑快速进入安全模式的方法
- workbook对象需要关闭_jxl读取excel需要关闭Workbook?
- xp本地连接不见怎么办|本地网络连接不见解决方法
- 2019 计蒜之道 初赛 第一场 A-商汤的AI伴游小精灵
- win11x64 与HP1020打印机适配不成功
- ROS机器人控制 —— 键盘方向控制
热门文章
- php的验证码要gd库,怎么在PHP中使用GD库实现一个验证码功能
- koa2 mysql增删改查_react+koa2+mysql零门槛的全栈体验,附上完整项目分享
- 020303阶段三 I/O复用 select和epoll的文件描述符管理
- GCC 编译时优化某一个或几个函数或者不优化某一个或几个函数
- vue axios 返回参数 响应参数
- JavaScript实现省市二级联动
- 粘性控件,滑动停留StickLayout(导航栏滑动停留)
- CDH集群调优:内存、Vcores和DRF
- 查看xxx.a库架构的命令
- 为iptables开放新的网络端口