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

重建二叉树-C++

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程https://www.captainai.net/troubleshooter

// 面试题7:重建二叉树 // 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输 // 入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1, // 2, 4, 7, 3, 5, 6, 8}和中序遍历序列{4, 7, 2, 1, 5, 3, 8, 6},则重建出 // 图2.6所示的二叉树并输出它的头结点。 #include <exception> #include <cstdio> #include <stdexcept> struct BinaryTreeNode { int m_nValue; BinaryTreeNode *m_pLeft; BinaryTreeNode *m_pRight; }; BinaryTreeNode *CreateBinaryTreeNode(int value) { BinaryTreeNode *pNode = new BinaryTreeNode(); pNode->m_nValue = value; pNode->m_pLeft = nullptr; pNode->m_pRight = nullptr; return pNode; } void ConnectTreeNodes(BinaryTreeNode *pParent, BinaryTreeNode *pLeft, BinaryTreeNode *pRight) { if (pParent != nullptr) { pParent->m_pLeft = pLeft; pParent->m_pRight = pRight; } } void PrintTreeNode(const BinaryTreeNode *pNode) { if (pNode != nullptr) { printf("value of this node is: %d\n", pNode->m_nValue); if (pNode->m_pLeft != nullptr) printf("value of its left child is: %d.\n", pNode->m_pLeft->m_nValue); else printf("left child is nullptr.\n"); if (pNode->m_pRight != nullptr) printf("value of its right child is: %d.\n", pNode->m_pRight->m_nValue); else printf("right child is nullptr.\n"); } else { printf("this node is nullptr.\n"); } printf("\n"); } void PrintTree(const BinaryTreeNode *pRoot) { PrintTreeNode(pRoot); if (pRoot != nullptr) { if (pRoot->m_pLeft != nullptr) PrintTree(pRoot->m_pLeft); if (pRoot->m_pRight != nullptr) PrintTree(pRoot->m_pRight); } } void DestroyTree(BinaryTreeNode *pRoot) { if (pRoot != nullptr) { BinaryTreeNode *pLeft = pRoot->m_pLeft; BinaryTreeNode *pRight = pRoot->m_pRight; delete pRoot; pRoot = nullptr; DestroyTree(pLeft); DestroyTree(pRight); } } BinaryTreeNode *ConstructCore(int *startPreorder, int *endPreorder, int *startInorder, int *endInorder); BinaryTreeNode *Construct(int *preorder, int *inorder, int length) { if (preorder == nullptr || inorder == nullptr || length <= 0) return nullptr; return ConstructCore(preorder, preorder + length - 1, inorder, inorder + length - 1); } BinaryTreeNode *ConstructCore( int *startPreorder, int *endPreorder, int *startInorder, int *endInorder) { // 前序遍历序列的第一个数字是根结点的值 int rootValue = startPreorder[0]; BinaryTreeNode *root = new BinaryTreeNode(); root->m_nValue = rootValue; root->m_pLeft = root->m_pRight = nullptr; if (startPreorder == endPreorder) { if (startInorder == endInorder && *startPreorder == *startInorder) return root; else throw std::logic_error("Invalid input."); } // 在中序遍历中找到根结点的值 int *rootInorder = startInorder; while (rootInorder <= endInorder && *rootInorder != rootValue) ++rootInorder; if (rootInorder == endInorder && *rootInorder != rootValue) throw std::logic_error("Invalid input."); int leftLength = rootInorder - startInorder; int *leftPreorderEnd = startPreorder + leftLength; if (leftLength > 0) { // 构建左子树 root->m_pLeft = ConstructCore(startPreorder + 1, leftPreorderEnd, startInorder, rootInorder - 1); } if (leftLength < endPreorder - startPreorder) { // 构建右子树 root->m_pRight = ConstructCore(leftPreorderEnd + 1, endPreorder, rootInorder + 1, endInorder); } return root; } // ====================测试代码==================== void Test(char *testName, int *preorder, int *inorder, int length) { if (testName != nullptr) printf("%s begins:\n", testName); printf("The preorder sequence is: "); for (int i = 0; i < length; ++i) printf("%d ", preorder[i]); printf("\n"); printf("The inorder sequence is: "); for (int i = 0; i < length; ++i) printf("%d ", inorder[i]); printf("\n"); try { BinaryTreeNode *root = Construct(preorder, inorder, length); PrintTree(root); DestroyTree(root); } catch (std::exception &exception) { printf("Invalid Input.\n"); } } // 普通二叉树 // 1 // / \ // 2 3 // / / \ // 4 5 6 // \ / // 7 8 void Test1() { const int length = 8; int preorder[length] = {1, 2, 4, 7, 3, 5, 6, 8}; int inorder[length] = {4, 7, 2, 1, 5, 3, 8, 6}; Test("Test1", preorder, inorder, length); } // 所有结点都没有右子结点 // 1 // / // 2 // / // 3 // / // 4 // / // 5 void Test2() { const int length = 5; int preorder[length] = {1, 2, 3, 4, 5}; int inorder[length] = {5, 4, 3, 2, 1}; Test("Test2", preorder, inorder, length); } // 所有结点都没有左子结点 // 1 // \ // 2 // \ // 3 // \ // 4 // \ // 5 void Test3() { const int length = 5; int preorder[length] = {1, 2, 3, 4, 5}; int inorder[length] = {1, 2, 3, 4, 5}; Test("Test3", preorder, inorder, length); } // 树中只有一个结点 void Test4() { const int length = 1; int preorder[length] = {1}; int inorder[length] = {1}; Test("Test4", preorder, inorder, length); } // 完全二叉树 // 1 // / \ // 2 3 // / \ / \ // 4 5 6 7 void Test5() { const int length = 7; int preorder[length] = {1, 2, 4, 5, 3, 6, 7}; int inorder[length] = {4, 2, 5, 1, 6, 3, 7}; Test("Test5", preorder, inorder, length); } // 输入空指针 void Test6() { Test("Test6", nullptr, nullptr, 0); } // 输入的两个序列不匹配 void Test7() { const int length = 7; int preorder[length] = {1, 2, 4, 5, 3, 6, 7}; int inorder[length] = {4, 2, 8, 1, 6, 3, 7}; Test("Test7: for unmatched input", preorder, inorder, length); } int main(int argc, char *argv[]) { Test1(); Test2(); Test3(); Test4(); Test5(); Test6(); Test7(); return 0; } // ------ Output ------ /* Test1 begins: The preorder sequence is: 1 2 4 7 3 5 6 8 The inorder sequence is: 4 7 2 1 5 3 8 6 value of this node is: 1 value of its left child is: 2. value of its right child is: 3. value of this node is: 2 value of its left child is: 4. right child is nullptr. value of this node is: 4 left child is nullptr. value of its right child is: 7. value of this node is: 7 left child is nullptr. right child is nullptr. value of this node is: 3 value of its left child is: 5. value of its right child is: 6. value of this node is: 5 left child is nullptr. right child is nullptr. value of this node is: 6 value of its left child is: 8. right child is nullptr. value of this node is: 8 left child is nullptr. right child is nullptr. Test2 begins: The preorder sequence is: 1 2 3 4 5 The inorder sequence is: 5 4 3 2 1 value of this node is: 1 value of its left child is: 2. right child is nullptr. value of this node is: 2 value of its left child is: 3. right child is nullptr. value of this node is: 3 value of its left child is: 4. right child is nullptr. value of this node is: 4 value of its left child is: 5. right child is nullptr. value of this node is: 5 left child is nullptr. right child is nullptr. Test3 begins: The preorder sequence is: 1 2 3 4 5 The inorder sequence is: 1 2 3 4 5 value of this node is: 1 left child is nullptr. value of its right child is: 2. value of this node is: 2 left child is nullptr. value of its right child is: 3. value of this node is: 3 left child is nullptr. value of its right child is: 4. value of this node is: 4 left child is nullptr. value of its right child is: 5. value of this node is: 5 left child is nullptr. right child is nullptr. Test4 begins: The preorder sequence is: 1 The inorder sequence is: 1 value of this node is: 1 left child is nullptr. right child is nullptr. Test5 begins: The preorder sequence is: 1 2 4 5 3 6 7 The inorder sequence is: 4 2 5 1 6 3 7 value of this node is: 1 value of its left child is: 2. value of its right child is: 3. value of this node is: 2 value of its left child is: 4. value of its right child is: 5. value of this node is: 4 left child is nullptr. right child is nullptr. value of this node is: 5 left child is nullptr. right child is nullptr. value of this node is: 3 value of its left child is: 6. value of its right child is: 7. value of this node is: 6 left child is nullptr. right child is nullptr. value of this node is: 7 left child is nullptr. right child is nullptr. Test6 begins: The preorder sequence is: The inorder sequence is: this node is nullptr. Test7: for unmatched input begins: The preorder sequence is: 1 2 4 5 3 6 7 The inorder sequence is: 4 2 8 1 6 3 7 Invalid Input. */
http://www.jsqmd.com/news/841425/

相关文章:

  • ChatGPT免费版的“温柔陷阱”(资深NLP工程师20年踩坑总结):你以为在练提示词,其实正在喂养受限模型训练数据
  • 航空器配载与货运管理系统——从基础装载到载重平衡的三次迭代总结
  • 苏州金首饰回收投资银条回收铂金手镯回收30分钻石回收二手黄金回收高价多少钱一克同城价格查询上门上门估价闲置变现转让靠谱权威排行榜 - 检测回收中心
  • GitHub Actions自动化工作流实战:大型Markdown文档链接检查与质量保障
  • 山南黄金项链回收老银器回收旧铂金回收1克拉钻石回收二手铂金回收本地排名正规门店专业推荐哪家靠谱二手哪家强 - 检测回收中心
  • 英雄联盟R3nzSkin内存换肤技术深度解析:从原理到实战的完整指南
  • 山南金条回收银条回收铂金项链回收克拉钻石回收婚嫁首饰回收本地排名正规门店专业推荐哪家靠谱二手哪家强 - 检测回收中心
  • Spring Boot 3.x 实战:一站式集成 springdoc-openapi 与 Swagger UI
  • AI智能体开发实战:agent-skills工具库核心技能解析与应用
  • 曲靖千足金回收银项链回收铂金首饰回收裸钻回收闲置首饰回收本地排名正规门店专业推荐哪家靠谱二手哪家强 - 检测回收中心
  • 3步搞定Windows上的Android应用安装:告别模拟器的终极方案
  • 上饶足金回收银手镯回收PT990铂金回收钻石戒指回收旧首饰回收高价多少钱一克同城价格查询上门上门估价闲置变现转让靠谱权威排行榜 - 检测回收中心
  • 普洱金首饰回收投资银条回收铂金手镯回收30分钻石回收二手黄金回收高价多少钱一克同城价格查询上门上门估价闲置变现转让靠谱权威排行榜 - 检测回收中心
  • 邵阳千足金回收银项链回收铂金首饰回收裸钻回收闲置首饰回收高价多少钱一克同城价格查询上门上门估价闲置变现转让靠谱权威排行榜 - 检测回收中心
  • 泉州黄金手镯回收纯银回收白金回收50分钻石回收二手钻石回收高价多少钱一克同城价格查询上门上门估价闲置变现转让靠谱权威排行榜 - 检测回收中心
  • STC单片机开发环境搭建:Keil5芯片包安装与配置全攻略
  • 佛山广东春季高考培训机构培训哪家好?全日制培训班推荐 - 检测回收中心
  • 宝塔面板如何定期清理日志垃圾_设置计划任务自动清理.txt
  • PUA-Mean-Editor:专为Unicode私用区字符数据设计的均值计算工具
  • 转行无相关经验怎么活?AI一键生成简历,HR主动约面!
  • 南通金条回收银条回收铂金项链回收克拉钻石回收婚嫁首饰回收本地排名正规门店专业推荐哪家靠谱二手哪家强 - 检测回收中心
  • 终极AMD Ryzen处理器调试指南:如何用SMUDebugTool解锁隐藏性能潜力
  • 宁夏黄金项链回收老银器回收旧铂金回收1克拉钻石回收二手铂金回收高价多少钱一克同城价格查询上门上门估价闲置变现转让靠谱权威排行榜 - 检测回收中心
  • 30岁程序员的职业分叉口:是继续写代码还是转管理
  • linux上配置maven环境
  • 绍兴黄金戒指回收白银首饰回收高价铂金回收品牌钻戒回收二手白银回收本地排名正规门店专业推荐哪家靠谱二手哪家强 - 检测回收中心
  • 猫抓cat-catch实战指南:高效解决网页媒体资源捕获难题
  • ARM Cortex-R系列处理器架构与应用解析
  • 宝塔面板如何定期清理日志垃圾_设置计划任务自动清理
  • 国产多模态大模型:从设计图到代码的“智能翻译官”