代码随想录算法训练营第二十天|654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

news/2024/10/17 20:32:46/

最大二叉树

题目链接:力扣

这题 和昨天 根据前序中序(后序中序)构造二叉树题目的思想是一样的。
先找到nums中的最大值,再根据最大值的位置将其余节点划分为左右子树,在这过程中要注意左右子树保持左闭右开区间。
注意递归法时,终止条件为“传入的数组大小为1”,也就是说numsbegin == numsend,此时说明已经遍历到了叶子节点。 

class Solution {
public:TreeNode* constructMaximumBinaryTree(vector<int>& nums) {return traversal(nums,0,nums.size());}TreeNode* traversal(vector<int>& nums, int numsbegin, int numsend){if(numsbegin == numsend) return nullptr;int index = numsbegin;int maxvalue = INT_MIN;for(int i=numsbegin; i<numsend;i++)    //寻找nums中的最大值{if(nums[i] > maxvalue){maxvalue = nums[i];index = i;}            }TreeNode* midNode = new TreeNode(maxvalue);//遵循左闭右开int leftbegin = numsbegin;int leftend = index;int rightbegin = index+1;int rightend = numsend;midNode->left = traversal(nums,leftbegin,leftend);midNode->right = traversal(nums,rightbegin,rightend);return midNode;}
};

合并二叉树

题目链接:力扣

 遍历两个树和遍历一个树逻辑是一样的,只不过传入两个树的节点,同时操作
这里采用前序遍历比较好理解。

class Solution {
public:TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {return traversal(root1, root2);        }TreeNode* traversal(TreeNode* cur1, TreeNode* cur2){if(!cur1 && !cur2) return nullptr;else if(!cur1 && cur2) return cur2;else if(cur1 && !cur2) return cur1;int NodeVal = cur1->val + cur2->val;TreeNode* Node = new TreeNode(NodeVal);Node->left = traversal(cur1->left, cur2->left);Node->right = traversal(cur1->right,cur2->right);return Node;}
};

二叉搜索树中的搜索

题目链接: 力扣

做这道题目 要重复利用好二叉搜索树的性质 ,二叉搜索树的节点是有序的,所以可以有方向的去搜索。

二叉搜索树是一个有序树:

  • 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  • 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  • 它的左、右子树也分别为二叉搜索树

递归法:

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

迭代法:
二叉搜索树的特殊性就是节点的有序性,所以可以不使用辅助栈或者队列就可以写出迭代法。

    TreeNode* searchBST(TreeNode* root, int val){while(root){if(root->val < val)root = root->right;else if(root->val > val)root = root->left;elsereturn root;}return nullptr;}

验证二叉搜索树 

题目链接:力扣 

知识点:在中序遍历下,输出的二叉搜索树节点的数值是有序序列。
即验证二叉搜索树,就相当于变成了判断一个序列是不是递增的了。

在写这道题之初,我掉入了一个陷阱,即单纯的比较了左节点小于中间节点,右节点大于中间节点。即

//错误示例!!!
bool isValidBST1(TreeNode* root) {       if(!root) return true;bool left = root->left && root->left->val < root->val;bool right = root->right && root->right->val > root->val;if((!root->left && !root->right) ||(!root->left && right) || (left && !root->right)||(left && right))return isValidBST(root->left) && isValidBST(root->right);elsereturn false;}

但是,我们应该要做的是 比较左子树所有节点小于中间节点,右子树所有节点大于中间节点

例如上图中的树就不属于二叉搜索树!

正确代码:

    long long maxVal = LONG_MIN;bool isValidBST(TreeNode* root) {    if(!root) return true;bool leftBST = isValidBST(root->left);if(maxVal < root->val)  maxVal = root->val;else return false;bool rightBST = isValidBST(root->right);return (leftBST && rightBST);}


http://www.ppmy.cn/news/104037.html

相关文章

第四章 相似矩阵与矩阵对角化

引言 题型总结中推荐例题有蓝皮书的题型较为重要&#xff0c;只有吉米多维奇的题型次之。码字不易&#xff0c;如果这篇文章对您有帮助的话&#xff0c;希望您能点赞、评论、收藏&#xff0c;投币、转发、关注。您的鼓励就是我前进的动力&#xff01; 知识点思维导图 补充&…

Vue 原始(传统)或特别的视频组件具体实现方法

一、原始的播放器组件&#xff08;传统的视频播放组件&#xff09; 参考链接 1. Vue2视频播放&#xff08;Video&#xff09; 二、自定义视频播放组件&#xff0c;自播放&#xff0c;无控制模式 简单点的理解&#xff0c;就是没有点击就会暂停播放视频&#xff0c;还有忽略…

win11使用命令行建立wifi热点,并可以设定名称密码等

主要是想自动化的实现打开wifi热点,ssid和wifi密码可控!手机设定比较简单,但是用程序行来设定还真是比较麻烦。 查了一下,有人使用netsh 无法解决,也就是说无法使用如下命令启动移动热点: netsh wlan set hostednetwork mode=allow ssid=wifi888 key=88888888 netsh wl…

十五、多线程(上)

文章目录 一、线程&#xff08;一&#xff09;什么是线程&#xff08;二&#xff09;Linux下的多线程&#xff08;三&#xff09;总结&#xff08;四&#xff09;线程优点&#xff08;五&#xff09;线程缺点&#xff08;六&#xff09;线程异常&#xff08;七&#xff09;线程…

【jquery常见事件】Jquery常见事件应用汇总【附应用场景】

【写在前面】前端时间也去试了个水参加了一下网管的考试&#xff0c;上午感觉还不错&#xff0c;下午就有点懵了&#xff0c;上周也没有更新我的博客了&#xff0c;今天我们就针对jquery事件领域做一个汇总介绍吧&#xff0c;主要介绍jquery的点击事件、鼠标事件、派发事件、阻…

JDBC与DBCP整合

DBCP:DataBase Connection Pool,数据库连接池负责分配、管理和释放数据库连接&#xff0c;它允许应用程序重复使用一个现有的数据库连接&#xff0c;而不是再重新建立一个&#xff1b;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接…

北京发布Web3.0白皮书!币圈扬言:国际金融格局即将重塑!

如今&#xff0c;虚拟资产已成为香港数字经济与金融创新的“桥头堡”。随着加密新政生效在即&#xff0c;市场暗流涌动&#xff0c;头部交易所争相布局&#xff0c;香港或将迎来新一轮的加密竞争。 多家交易所进军香港 5月28日&#xff0c;欧易&#xff08;OKX&#xff09;完成…

Vivado综合属性系列之十三 FSM_ENCODING

目录 一、前言 二、FSM_ENCODING ​2.1 属性介绍 ​2.2 工程代码 2.3 结果 ​2.4 参考资料 一、前言 ​状态机的实现有很多方式&#xff0c;如auto&#xff0c;one_hot&#xff0c;sequential&#xff0c;如下图中Synthesis中-fsm_extraction的配置项&#xff0c;但此处作用范…