news 2026/4/20 14:05:22

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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; } };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/20 8:06:23

从结构到性能|《Adv. Funct. Mater.》MOF基电催化剂的设计策略与应用前沿

前言 随着全球对可持续能源和绿色化学工艺的需求日益迫切&#xff0c;电催化技术已成为现代科研与工业创新的重要方向。在这一背景下&#xff0c;电活性金属有机框架&#xff08;e-MOFs&#xff09;作为一种新兴材料体系&#xff0c;以其独特的结构可调性、高比表面积和明确的活…

作者头像 李华
网站建设 2026/4/18 23:32:31

深入 JBoltAI 架构:插件化 + 模块化设计,让扩展更

在AI技术深度融入各行业系统的当下&#xff0c;企业对于AI应用开发框架的核心诉求&#xff0c;已从单纯的功能实现转向灵活扩展、系统兼容与低成本改造。JBoltAI作为聚焦Java生态的企业级AI应用开发框架&#xff0c;其架构设计围绕扩展性与适配性展开&#xff0c;为企业系统的A…

作者头像 李华
网站建设 2026/4/18 16:54:36

【课程设计/毕业设计】基于SpringBoot的宠物之家管理系统基于springboot的宠物店管理系统【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/18 3:18:33

COMSOL 10kHz 正弦电压双介质氩空腔放电模型探索

&#xff3b;COMSOL交流10kHz正弦电压双介质氩空腔放电模型&#xff3d;&#xff0c;分别为介电常数3的聚碳酸酯和介电常数5.2的环氧树脂&#xff0c;与IEEE文献基本一致&#xff0c;可以拿去参考。 最近在研究 COMSOL 模拟领域&#xff0c;捣鼓了一个挺有意思的模型——10kHz …

作者头像 李华