当前位置: 首页 > news >正文

day 17|654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树

day 17|

654.最大二叉树

654.最大二叉树 | 代码随想录

笔记:

构造二叉树的时候一般都使用前序遍历(中左右),因为一般都需要先把节点创建好后再去递归遍历他的左右子树。

实操出现问题:

为什么要判断不为空?因为前面的截止条件里面没有空的情况。那空节点怎么构造?实际上在创建这个new_node的时候就已经构造好了,如果maxindex左/右没有值了,就不会进入判断,从而保持原来的值为nullptr

代码/比较

class Solution {
public:TreeNode* constructMaximumBinaryTree(vector<int>& nums) {//截止条件:如果只有一个数字了,则返回当前构造的nodeif(nums.size()==1)return new TreeNode(nums[0]);//单层递归逻辑:中左右遍历顺序;中:寻找最大值,构造节点;左右:依次递归构造左右子树,注意传入的数组应该是不同的。最后返回当前构造的节点;//中,寻找最大值int maxval=0;int maxindex=0;for(int i=0;i<nums.size();i++){if(maxval<nums[i]){maxindex=i;maxval=nums[i];}}TreeNode* new_node=new TreeNode(maxval);//左//为什么要判断不为空?因为前面的截止条件里面没有空的情况。那空节点怎么构造?实际上在创建这个new_node的时候就已经构造好了,如果maxindex左/右没有值了,就不会进入判断,从而保持原来的值为nullptrif(maxindex>0){vector<int> nums_left(nums.begin(),nums.begin()+maxindex);new_node->left=constructMaximumBinaryTree(nums_left);}//右if(maxindex<nums.size()-1){ vector<int> nums_right(nums.begin()+maxindex+1,nums.end());new_node->right=constructMaximumBinaryTree(nums_right);}return new_node;}
};

617.合并二叉树

617.合并二叉树 | 代码随想录

笔记:

自己的想法与代码问题:

1.输入参数:两个根节点。输出参数:得到的二叉树根节点。

2.截止条件:如果两个节点都是null,返回null

3.单层递归的逻辑:首先构造中节点为两个值相加(如果有一个为空,则加0即可);依次向左右递归生成左右子树即可

代码如下:

class Solution {
public:TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {//遍历顺序:前序遍历(中左右)//截止条件:如果两个节点都是null,返回nullif(root1==nullptr&&root2==nullptr)return nullptr;//单词递归逻辑:首先构造中节点为两个值相加(如果有一个为空,则加0即可);依次向左右递归生成左右子树即可TreeNode* new_node;if(root1==nullptr&&root2!=nullptr)new_node=new TreeNode(root2->val);else if(root2==nullptr&&root1!=nullptr)new_node=new TreeNode(root1->val);elsenew_node=new TreeNode(root1->val+root2->val);new_node->left = mergeTrees(root1 ? root1->left : nullptr,  // 如果root1为空,传递nullptrroot2 ? root2->left : nullptr   // 如果root2为空,传递nullptr);new_node->right = mergeTrees(root1 ? root1->right : nullptr,  // 如果root1为空,传递nullptrroot2 ? root2->right : nullptr   // 如果root2为空,传递nullptr);return new_node;}
};

出现的问题:在向下一层递归的时候要注意,如果是root1/root2是空指针,应该向下继续传递空指针,否则会操作空指针导致程序崩溃。

课程中的笔记:

1.输入参数:两个根节点。输出参数:得到的二叉树根节点。

2.截止条件:如果其中一个节点为null,返回另一个树的当前遍历节点

3.单层递归的逻辑:构建一个二叉树结点,其中的值以当前两个值得和赋值,然后依次遍历左右子树。

代码如下:

class Solution {
public:TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {//遍历顺序:前序遍历(中左右)//截止条件:如果其中一个节点为null,返回另一个树的当前遍历节点if(root1==nullptr) return root2;if(root2==nullptr) return root1;//单层递归逻辑:构建一个二叉树结点,以两个结点得值的和赋值,再依次遍历左右子树TreeNode* new_node=new TreeNode(root1->val+root2->val);new_node->left=mergeTrees(root1->left,root2->left);new_node->right=mergeTrees(root1->right,root2->right);return new_node;}
};

思考:如果返回的是root1/root2,就代表着这个root1/root2结点同时存在于两个树之中。

700.二叉搜索树中的搜索

700.二叉搜索树中的搜索 | 代码随想录

递归:

二叉搜索树的定义:

  1. 非空左子树的所有键值小于其根结点的键值。
  2. 非空右子树的所有键值大于其根结点的键值。
  3. 左、右子树都是二叉搜索树。

1.截止条件:如果搜索到了,则直接返回,如果当前是null,也直接返回。

2.单层递归逻辑:如果当前的值比val小,当前的值应该大一点才对,所以向右递归;如果当前值比val大了,向左递归

class Solution {
public:TreeNode* searchBST(TreeNode* root, int val) {//截止条件:如果搜索到了,则直接返回,如果当前是null,也直接返回。if(root==nullptr) return nullptr;if(root->val==val) return root;//单层递归逻辑:如果当前的值比val小,当前的值应该大一点才对,所以向右递归;如果当前值比val大了,向左递归TreeNode* result=nullptr;if(root->val<val) result=searchBST(root->right,val);if(root->val>val) result=searchBST(root->left,val);return result;}
};

迭代:

class Solution {
public:TreeNode* searchBST(TreeNode* root, int val) {//迭代法while(root){if(root->val>val) root=root->left;else if(root->val<val)root=root->right;else if(root->val==val)return root;}return nullptr;}
};

注意中间不能多次操作指针,否则会出现操作空指针的情况。

98.验证二叉搜索树

笔记:

中序遍历下,二叉搜索树是一个有序序列

注意二叉搜索树的定义:

  1. 非空左子树所有键值小于其根结点的键值。
  2. 非空右子树所有键值大于其根结点的键值。
  3. 左、右子树都是二叉搜索树。

要注意是左子树和右子树的所有值。

1.截止条件:如果是空,返回true

2.递归逻辑:使用中序遍历(左中右)。遍历左子树;如果前面一个节点的值大于等于现在节点了,则返回false;遍历右子树;如果左右子树都是二叉搜索树,则返回true

代码:

class Solution {
public:TreeNode* prenode=nullptr;//记录前面一个值bool isValidBST(TreeNode* root) {//截止条件:如果是空,返回trueif(root==nullptr) return true;//递归逻辑:使用中序遍历(左中右)。遍历左子树;如果前面一个节点的值大于等于现在节点了,则返回false;遍历右子树;如果左右子树都是二叉搜索树,则返回truebool left_isvalid=isValidBST(root->left);if(prenode!=nullptr&&prenode->val>=root->val)return false;elseprenode=root;bool right_isvali=isValidBST(root->right);return left_isvalid&&right_isvali;}
};

1

http://www.jsqmd.com/news/322937/

相关文章:

  • 高精度乘法
  • linux 使用Xcb监听窗口
  • 【笔记】【股票小白入门5-股票界面】
  • linux 使用Xcb监听键盘鼠标输入
  • 26年寒假生活指导1.30
  • SAP克服艰难开局实现8%增长
  • C++面向对象入门:实验三
  • ManageEngine在阿联酋设立数据中心强化数据主权承诺
  • 东南亚海外仓商品SKU标准化,降低错发率提升仓库运营效率
  • AI大模型应用实践:40个高价值场景+151个典型应用+66个央企大模型清单
  • 网络安全跻身英国五大增长最快职业领域
  • 基于微信小程序的高校学生社团活动管理系统的设计和实现
  • 一文掌握大模型AI在行政管理中的高效应用技巧
  • 真香警告!RAG技术让大模型“知识库“实时更新,小白也能变大神
  • 拣货慢、错发多?1个策略,让东南亚海外仓一件代发效率翻倍!
  • Python+django基于小程序的企业员工考勤打卡系统设计与实现-
  • AI杀疯了!当大模型遇见结构化数据,这个“翻译官“技术让业务人员也能玩转SQL查询
  • 程序员必看!RAG系统调优实战,没有银弹只有数据说话
  • Python+django基于小程序的大学运动会比赛报名系统as6e8
  • 海外仓必看!这4类仓库已被跨境卖家集体避雷,附管理破局方案
  • Postman使用教程 - 教程
  • 自然语言处理在AI原生应用中的7个关键技术解析
  • 复杂推理任务协调中元控制器的决策优化研究
  • Python+django基于小程序的民宿预订系统-web pc 手机端
  • P4462 [CQOI2018] 异或序列
  • 检索增强生成(RAG)落地实践:深入剖析痛点与系统性解决方案
  • AI+企业办公:8大核心应用场景深度解析,从入门到精通
  • 大数据领域数据仓库的安全审计流程
  • 为什么要学习大模型应用开发?2026大模型学习宝典:零基础入门到高薪offer的进阶之路
  • 大模型实战案例:运营商如何从“管道“到“智能服务商“的华丽转身