代码随想录二刷Day20

今日任务

654.最大二叉树
617.合并二叉树
700.二叉搜索树中的搜索
98.验证二叉搜索树
语言:C++

654. 最大二叉树

链接:https://leetcode.cn/problems/maximum-binary-tree/
前序遍历

class Solution {public://[left, right]TreeNode* construct(vector<int>& nums, int left, int right){if(right - left == 0){TreeNode* root = new TreeNode(nums[left]);return root;}int max = left;for(int i = left + 1; i <= right; i++){max = nums[max] > nums[i] ? max : i;}TreeNode* root = new TreeNode(nums[max]);if(left <= max - 1) root->left = construct(nums, left, max - 1);if(max + 1 <= right) root->right = construct(nums, max + 1, right);return root;}TreeNode* constructMaximumBinaryTree(vector<int>& nums) {return construct(nums, 0, nums.size() - 1);}
};

617. 合并二叉树

链接:https://leetcode.cn/problems/merge-two-binary-trees/
递归

class Solution {public:TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {if(root1 == NULL && root2 == NULL) return NULL;if(root1 == NULL && root2 != NULL) return root2;if(root1 != NULL && root2 == NULL) return root1;root1->val = root1->val + root2->val;root1->left = mergeTrees(root1->left, root2->left);root1->right = mergeTrees(root1->right, root2->right);return root1;}
};

迭代

class Solution {public:TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {if(root1 == NULL && root2 == NULL) return NULL;if(root1 == NULL && root2 != NULL) return root2;if(root1 != NULL && root2 == NULL) return root1;queue<TreeNode*> que;que.push(root1);que.push(root2);while(!que.empty()){TreeNode* node1 = que.front();que.pop();TreeNode* node2 = que.front();que.pop();node1->val += node2->val;if(node1->left != NULL && node2->left != NULL){que.push(node1->left);que.push(node2->left);}if(node1->right != NULL && node2->right != NULL){que.push(node1->right);que.push(node2->right);}if(node1->left == NULL && node2->left != NULL){node1->left = node2->left;}if(node1->right == NULL && node2->right != NULL){node1->right = node2->right;}//下面两种情况不需要考虑,因为相当于node1没有发生变化//node1->left != NULL && node2->left == NULL//node1->right != NULL && node2->right == NULL}return root1;}
};

700. 二叉搜索树中的搜索

链接:https://leetcode.cn/problems/search-in-a-binary-search-tree/
递归

class Solution {public:TreeNode* searchBST(TreeNode* root, int val) {if(root == NULL) return NULL;if(root->val == val) return root;if(val < root->val) return searchBST(root->left, val);if(val > root->val) return searchBST(root->right, val);return NULL;}
};

迭代

class Solution {public:TreeNode* searchBST(TreeNode* root, int val) {if(root->val == val) return root;TreeNode* cur = root;while(cur){if(cur == NULL) break;else if(val < cur->val) cur = cur->left;else if(val > cur->val) cur = cur->right;else if(val == cur->val) break;}return cur;}
};

98. 验证二叉搜索树

链接:https://leetcode.cn/problems/validate-binary-search-tree/
陷阱:不可以只验证当前子树的父子节点间是否满足二叉搜索树特性,有可能隔着几个节点发现条件不满足了
二叉搜索树按照中序遍历会得到单调递增的数组
递归

class Solution {public:vector<int> res;void traversal(TreeNode* root){if(root == NULL) return;traversal(root->left);res.push_back(root->val);traversal(root->right);}bool isValidBST(TreeNode* root) {traversal(root);for(int i = 1; i < res.size(); i++){if(res[i] <= res[i - 1]) return false;}return true;}
};

迭代

class Solution {public:vector<int> res;bool isValidBST(TreeNode* root) {stack<TreeNode*> st;st.push(root);while(!st.empty()){TreeNode* cur = st.top();if(cur != NULL){st.pop();if(cur->right) st.push(cur->right);st.push(cur);st.push(NULL);if(cur->left) st.push(cur->left);}else{st.pop();cur = st.top();st.pop();res.push_back(cur->val);}}for(int i = 1; i < res.size(); i++){if(res[i] <= res[i - 1]) return false;}return true;}
};

【代码随想录二刷】Day20-二叉树-C++相关推荐

  1. 【代码随想录二刷】Day21-二叉树-C++

    代码随想录二刷Day21 今日任务 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236.二叉树的最近公共祖先 语言:C++ 530. 二叉搜索树的最小绝对差 链接:https://le ...

  2. 【代码随想录二刷】Day15-二叉树-C++

    代码随想录二刷Day15 今日任务 层序遍历 226.翻转二叉树 101.对称二叉树 语言:C++ 层序遍历 102.二叉树的层序遍历 class Solution {public:vector< ...

  3. 【代码随想录二刷】Day23-二叉树-C++

    代码随想录二刷Day23 今日任务 669.修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树 语言:C++ 669. 修剪二叉搜索树 链接:https://leet ...

  4. 代码随想录二刷——动规篇章

    dp 动态规划篇 dp篇二刷复习 路径种数问题 63.不同路径 II 拆分问题 343. 整数拆分 96.不同的二叉搜索树 背包问题 0-1背包,最多选一个,选or不选 406.分割等和子集 1049 ...

  5. 【代码随想录二刷】day9 | 28. 实现 strStr() 459.重复的子字符串

    二刷主要记录理解不一样的题 一刷地址:day9 今日题目:中等 KMP:困难 => 第一时间想到了使用KMP,但是不太会,只有用常规方法完成 实现 strStr():拼接完两个字符串s之后,取其 ...

  6. 【代码随想录二刷】day 25 | 216.组合总和III 17.电话号码的字母组合

    二刷主要记录理解不一样的题 一刷地址:day25 今日题目:中等 组合总和III :注意剪枝操作:①sum>n:②path.size()>k class Solution {LinkedL ...

  7. <代码随想录二刷>链表

    文章目录 203. 移除链表元素 题目描述 思路分析 参考代码 206. 反转链表 题目描述 思路分析 参考代码 24. 两两交换链表中的节点 题目描述 思路分析 参考代码 19. 删除链表的倒数第 ...

  8. 随想录二刷Day15——二叉树

    文章目录 二叉树 2. 递归遍历二叉树 3. 二叉树的迭代遍历 4. 二叉树的统一迭代法 二叉树 2. 递归遍历二叉树 144. 二叉树的前序遍历 class Solution {public:vec ...

  9. 代码随想录二刷链表篇

    链表 2.移除链表元素 ● 如果head为空就返回head,定义虚拟头节点,pre节点,cur节点.当cur 不等于null时. ● 如果当前节点的值等于val,pre.next = cur.next ...

最新文章

  1. 改名 Meta,打元宇宙牌,老龄化的 Facebook 能否再换新颜
  2. 大咖说:出道十五载,认知五迭代
  3. eclispe的三个重要配置文件
  4. 深入理解Spark 2.1 Core (七):Standalone模式任务执行的原理与源码分析
  5. Php输出Xml报错:XML declaration allowed only at the start of the document
  6. vue-cli 将被 create-vue 替代?初始化基于 vite 的 vue3 项目为何如此简单?
  7. javascript 连续滚动
  8. docker之基础命令相关操作上
  9. 147. class_exists()
  10. 盐城哪里学计算机表格,盐城办公自动化周末班
  11. PHP添加网站版权信息,如何将版权和作者信息添加到用PHP创建的图像?
  12. 截止失真放大电路_音频放大器结构组成_音频放大器分类
  13. mac安静执行脚本_自动切换mac输入法-安静模式
  14. c语言cmp函数含义,【C艹】关于sort用法之重构cmp(comp)函数的笔记
  15. Windowns11并未完全抛弃IE内核,可向下兼容至IE7
  16. 【Jekyll】使用GitHub Pages + Jekyll搭建自己的技术博客,Jekyll服务器的搭建
  17. 【unity3D】单点和多点触控
  18. java6 官方API中文版
  19. Java学习笔记之基础语法(一)
  20. 王易见:后电商时代,家电制造业上升还是沉沦?

热门文章

  1. burpsuite的基本使用
  2. npm i安装包依赖时 gyp ERR! stack Error: Can‘t find Python executable “python“, you can set the PYTHON env
  3. 网页中 BarcodeReader.js 识别商品条形码
  4. 视频直播源码开发时关于MySQL数据库的恢复方案
  5. PHP语言:微信开放平台PC端扫码登录
  6. 关于fedora35下载速度慢的办法
  7. 使用宏灵活的控制代码
  8. 12306订票助手winform版
  9. buuctf-Had a bad day(文件包含)
  10. 关于 Java 模块系统,看这一篇就够了