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中二叉树相关题相关推荐

  1. Leetcode中二叉树中的搜索相关题目解析以及java实现

    Leetcode中二叉树中的搜索相关题目解析以及java实现 这一类的题目其实稍微有一些杂,基本就是在二叉树中寻找一些或者某个特定值,题目比较多,我们会通过两道三篇来总结,不过总体来说也基本上就是BF ...

  2. LeetCode中二叉树题目总结

     本文仅为博主个人总结,水平有限,欢迎大神指出不妥处. 来自 https://www.cnblogs.com/love-yh/p/7248136.html 关于二叉树的相关概念可以参见二叉树的百度 ...

  3. 视频教程-算法设计与编算法设计与编程实践---基于leetcode的企业真题库程实践-C/C++

    算法设计与编算法设计与编程实践---基于leetcode的企业真题库程实践 夏曹俊:南京捷帝科技有限公司创始人,南京大学计算机硕士毕业,有15年c++跨平台项目研发的经验,领导开发过大量的c++虚拟仿 ...

  4. Leetcode每日必刷题库第80题,如何在不使用外部空间的情况下对有序数组去重?

    LeetCode的第80题,有序数组去重II(Remove Duplicates from Sorted Array II). 这题的官方难度是Medium,通过率是43.3%,点赞1104,反对69 ...

  5. LeetCode:二叉树相关应用

    LeetCode:二叉树相关应用 基础知识 617.归并两个二叉树 题目 Given two binary trees and imagine that when you put one of the ...

  6. 【LeetCode】第643题——子数组最大平均数I(难度:简单)

    [LeetCode]第643题--子数组最大平均数I(难度:简单) 题目描述 解题思路 代码详解 注意点 题目描述 给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数. 示 ...

  7. 【LeetCode】第374题——猜数字大小(难度:简单)

    [LeetCode]第374题--猜数字大小(难度:简单) 题目描述 解题思路 代码详解 注意点 题目描述 猜数字游戏的规则如下: 每轮游戏,我都会从 1 到 n 随机选择一个数字. 请你猜选出的是哪 ...

  8. 《算法设计编程实验:大学程序设计课程与竞赛训练教材》——2.4 相关题库...

    2.4 相关题库 [2.4.1 Mileage Bank] [问题描述] ACM(Airline of Charming Merlion,迷人的鱼尾狮航空公司)的飞行里程计划对于经常要乘坐飞机的旅客非 ...

  9. 【LeetCode】第599题——两个列表的最小索引总和(难度:简单)

    [LeetCode]第599题--两个列表的最小索引总和(难度:简单) 题目描述 解题思路 代码详解 注意点 题目描述 假设Andy和Doris想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的 ...

最新文章

  1. http响应头里没有或者有content-length的几种可能性
  2. 在Linux里使用dosbox运行debug.exe
  3. Vue.js学习系列(二十八)-- 计算属性(二)
  4. shell脚本中取消高亮显示_Linux中强大的top命令
  5. IPV6迎来商业元年 运营商短期盈利模式成难点
  6. cobalt strick 4.0 系列教程(6)Payload Artifact 和反病毒规避
  7. 丹琦女神新作:对比学习,简单到只需要Dropout两下
  8. java web 不用框架_MyShop-不用框架的基础javaweb项目
  9. python3.6,--登录知乎
  10. 2020年开发者大会资料和武大定量遥感视频分享(部分)
  11. 破解密码——利用粘滞键漏洞破解Windows 7 PIN
  12. matlab 平滑曲线连接_如何使用Affinity Designer for mac编辑矢量曲线和形状
  13. 阿里飞天分布式操作系统
  14. c# 定义四边形_C# 绘制多边形
  15. 惠普计算机进入安全模式,Windows10系统惠普电脑快速进入安全模式的方法
  16. workbook对象需要关闭_jxl读取excel需要关闭Workbook?
  17. xp本地连接不见怎么办|本地网络连接不见解决方法
  18. 2019 计蒜之道 初赛 第一场 A-商汤的AI伴游小精灵
  19. win11x64 与HP1020打印机适配不成功
  20. ROS机器人控制 —— 键盘方向控制

热门文章

  1. php的验证码要gd库,怎么在PHP中使用GD库实现一个验证码功能
  2. koa2 mysql增删改查_react+koa2+mysql零门槛的全栈体验,附上完整项目分享
  3. 020303阶段三 I/O复用 select和epoll的文件描述符管理
  4. GCC 编译时优化某一个或几个函数或者不优化某一个或几个函数
  5. vue axios 返回参数 响应参数
  6. JavaScript实现省市二级联动
  7. 粘性控件,滑动停留StickLayout(导航栏滑动停留)
  8. CDH集群调优:内存、Vcores和DRF
  9. 查看xxx.a库架构的命令
  10. 为iptables开放新的网络端口