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

23.C++进阶:二叉树OJ|二叉树创建字符串|最近公共祖先|搜索树与双向链表|前中序构建二叉树|二叉树的非递归遍历

606. 根据二叉树创建字符串 - 力扣(LeetCode)

class Solution { public: string tree2str(TreeNode* root) { if (root == nullptr) return ""; string ret = to_string(root->val); if (root->left || root->right) { ret += '('; ret += tree2str(root->left); ret += ')'; } if (root->right) { ret += '('; ret += tree2str(root->right); ret += ')'; } return ret; } };

236. 二叉树的最近公共祖先 - 力扣(LeetCode)

若是二叉搜索树

class Solution { public: bool IsInTree(TreeNode* root, TreeNode* x) { if(root == nullptr) return false; return root == x || IsInTree(root->left, x) || IsInTree(root->right, x); } TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { if(root == NULL) return NULL; if(root == p || root == q) { return root; } bool pInLeft, pInRight, qInLeft, qInRight; pInLeft = IsInTree(root->left, p); pInRight =!pInLeft; qInLeft = IsInTree(root->left, q); qInRight =!qInLeft; if((pInLeft && qInRight) || (qInLeft && pInRight)) { return root; } else if(pInLeft && qInLeft) { return lowestCommonAncestor(root->left, p, q); } else if(pInRight && qInRight) { return lowestCommonAncestor(root->right, p, q); } assert(false); return NULL; } };

class Solution { public: bool GetPath(TreeNode* root, TreeNode* x, stack<TreeNode*>& path) { if(root == nullptr) return false; path.push(root); if(root == x) return true; if(GetPath(root->left, x, path)) return true; if(GetPath(root->right,x, path)) return true; path.pop(); return false; } TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { stack<TreeNode*> pPath, qPath; GetPath(root, p, pPath); GetPath(root, q, qPath); //两个路径找交点 while(pPath.size() != qPath.size()) { if(pPath.size() > qPath.size()) pPath.pop(); else qPath.pop(); } while(pPath.top() != qPath.top()) { pPath.pop(); qPath.pop(); } return pPath.top(); } };

二叉搜索树与双向链表_牛客题霸_牛客网

class Solution { public: void InOrderConvert(TreeNode* cur, TreeNode*& prev) { if(cur == nullptr) return; InOrderConvert(cur->left, prev); // cur中序 // 当前节点的左,指向前一个节点 cur->left = prev; // 前一个节点的右,指向当前节点 if (prev) prev->right = cur; prev = cur; InOrderConvert(cur->right, prev); } TreeNode* Convert(TreeNode* pRootOfTree) { TreeNode* prev = nullptr; InOrderConvert(pRootOfTree, prev); TreeNode* head = pRootOfTree; while (head && head->left) { head = head->left; } return head; } };

105. 从前序与中序遍历序列构造二叉树 - 力扣(LeetCode)

class Solution { public: TreeNode* _buildTree(vector<int>& preorder, vector<int>& inorder, int& prei, int inbegin, int inend) { if (inbegin > inend) return nullptr; TreeNode* root = new TreeNode(preorder[prei++]); //分割中序左右子区间 int rooti = inbegin; while (rooti <= inend) { if (inorder[rooti] == root->val) break; else rooti++; } //[inbegin,rooti-1],rooti,[rooti+1, inend] root->left = _buildTree(preorder, inorder, prei, inbegin, rooti-1); root->right = _buildTree(preorder, inorder, prei, rooti+1, inend); return root; } TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { int i = 0; TreeNode* root = _buildTree(preorder, inorder, i, 0, inorder.size()-1); return root; } };

144. 二叉树的前序遍历 - 力扣(LeetCode)

class Solution { public: vector<int> preorderTraversal(TreeNode* root) { stack<TreeNode*> s; vector<int> v; TreeNode* cur = root; while(cur || !s.empty()) { //1、访问左路节点,左路节点入栈 while (cur) { v.push_back(cur->val); s.push(cur); cur = cur->left; } //2、依次访问左路节点的右子树 TreeNode* top = s.top(); s.pop(); //访问左路节点的右子树 --子问题 cur = top->right; } return v; } };

94. 二叉树的中序遍历 - 力扣(LeetCode)

class Solution { public: vector<int> inorderTraversal(TreeNode* root) { stack<TreeNode*> s; vector<int> v; TreeNode* cur = root; while(cur || !s.empty()) { //1、访问左路节点,左路节点入栈 while (cur) { s.push(cur); cur = cur->left; } //2、依次访问左路节点的右子树 TreeNode* top = s.top(); s.pop(); // 栈里取到一个节点时,表示它的左子树访问完毕 v.push_back(top->val); //访问左路节点的右子树 --子问题 cur = top->right; } return v; } };

145. 二叉树的后序遍历 - 力扣(LeetCode)

class Solution { public: vector<int> postorderTraversal(TreeNode* root) { stack<TreeNode*> s; vector<int> v; TreeNode* cur = root; TreeNode* prev = nullptr; while(cur || !s.empty()) { //1、访问左路节点,左路节点入栈 while (cur) { s.push(cur); cur = cur->left; } //2、依次访问左路节点的右子树 TreeNode* top = s.top(); // 栈里面top,代表top的左子树已经访问完了 //1. 当前节点的右子树为空,则访问当前节点 //右子树不为空,上一个访问的节点是右子树的根,代表右子树访问过了 //2. 右子树不为空,子问题访问右子树 if (top->right == nullptr || top->right == prev) { v.push_back(top->val); s.pop(); prev = top; } else { //访问左路节点的右子树 --子问题 cur = top->right; } } return v; } };
http://www.jsqmd.com/news/254120/

相关文章:

  • PW6606芯片5V,9V,12V,15V,20V的PD快充协议诱骗芯片
  • C4D 建模 | 大屏设计 | 交互设计:兰亭妙微 UI 设计,让智慧园区管理 “可视可控”
  • 上海GEO优化公司哪家专业(技术实力对比/服务案例/选择标准) - 品牌排行榜
  • 2026一站式AI智能写作软件推荐:办公写作、润色校对、会议纪要、公文写作 - 深度智识库
  • centos7如何安装mysql8.0.44及相关配置
  • 好写作AI|学霸更牛,学渣逆袭?揭秘AI论文辅助的“马太效应”真相
  • linux数据库备份shell及定时任务crontab时间格式
  • 好写作AI|你的大脑需要“操作系统升级”:AI如何让你学会“思考自己的思考”
  • 东北学历提升好去处:2026年口碑机构精选,专升本报名/国家开放大学招生/学历提升/自考培训,学历提升学校推荐榜单 - 品牌推荐师
  • 好写作AI|没人明说的“学术潜规则”,正在被AI悄悄翻译给你
  • 如何让大模型真正“入场”干活?7城联动,获取AI落地的一线实战解法
  • 德永信集团:以“专数智”赋能注册代办与财税服务,助力企业数字化转型
  • 专业的采购管理系统推荐:智能寻源+供应商协同(千企验证) - 品牌排行榜
  • 2026实验室电加热炉厂家权威推荐榜单:导热油电加热炉/工业电加热炉/电加热炉/管式加热炉/管式电加热炉源头厂家精选。 - 品牌推荐官
  • 2026年振动筛实力厂家推荐榜:新乡华恒机械,矿用/不锈钢/直线/超声波/轻型/长方形振动筛全系供应 - 品牌推荐官
  • CNAS软件检测实验室认可,一次完整的方法验证过程是怎样的?
  • 毕业设计定制作品---【芳心科技】F. 智能声波美肤调控仪
  • Docker部署
  • 毕业设计定制作品---【芳心科技】F. 中频理疗仪PCB
  • 强烈安利8个AI论文平台,自考学生轻松搞定毕业论文!
  • 2026年 微型热电制冷器厂家推荐排行榜:TEC制冷模组、半导体制冷片、无振动环保制冷技术深度解析与选购指南 - 品牌企业推荐师(官方)
  • 2026年振动传感器国产标杆企业推荐:建大仁科领航行业新标杆 - 深度智识库
  • AI编程新风口:LangGraph StateGraph超详细教程,让小白也能优雅管理AI工作流!
  • 第十届遥感技术与应用国际会议(ICRSTA 2026)
  • JBoltAI V4:以体系化能力重塑企业数智化转型路径
  • 优质采购管理软件系统推荐:全品类覆盖+AI赋能(选型攻略) - 品牌排行榜
  • 面向云原生架构的时序数据库选型:在国际主流 TSDB 谱系中理解 Apache IoTDB比
  • 2026年 热电材料厂家推荐排行榜,热电模组/微型热电制冷器/半导体热电系统,N型P型热电臂与微结构模块技术深度解析 - 品牌企业推荐师(官方)
  • 告别 NAS 管理混乱 Sun-Panel+cpolar 让远程访问超省心
  • 2026年醋酸钠晶体厂家权威推荐榜单:三水合乙酸钠/污水菌种/氧化铝除氟剂/除氟絮凝剂/液体除氟剂源头厂家精选 - 品牌推荐官