层次遍历二叉树
来源:互联网 发布:92game源码仿17173 编辑:程序博客网 时间:2024/06/15 23:33
著作权所有者:何海涛
《剑指Offer——名企面试官精讲典型编程题》代码
题目23: 层次遍历二叉树
题目: 从上到下打印二叉树的每个结点,同一层的结点按照从左到右的顺序打印。
#include <iostream>#include <exception>#include <queue>using namespace std;struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;};BinaryTreeNode* ConstructCore(int* startPreorder, int* endPreorder, int* startInorder, int* endInorder);BinaryTreeNode* Construct(int* preorder, int* inorder, int length){ if (preorder == NULL || inorder == NULL || length <= 0) return NULL; 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 = NULL; if (startPreorder == endPreorder) { if (startInorder == endInorder && *startPreorder == *startInorder) return root; else throw std::exception("Invalid input."); } // 在中序遍历中找到根结点的值 int* rootInorder = startInorder; while (rootInorder <= endInorder && *rootInorder != rootValue) ++rootInorder; if (rootInorder == endInorder && *rootInorder != rootValue) throw std::exception("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 PrintFromTopToBottom(BinaryTreeNode* rRoot){ if (rRoot == NULL) return; queue<BinaryTreeNode*> queueNode; queueNode.push(rRoot); while (!queueNode.empty()) { BinaryTreeNode * pNode = queueNode.front(); queueNode.pop(); cout << pNode->m_nValue << " "; if (pNode->m_pLeft != nullptr) queueNode.push(pNode->m_pLeft); if (pNode->m_pRight != nullptr) queueNode.push(pNode->m_pRight); }}int main(){ 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 }; BinaryTreeNode* root = nullptr; try { root = Construct(preorder, inorder, length); } catch (std::exception& exception) { printf("Invalid Input.\n"); } PrintFromTopToBottom(root); return 0;}
0 0
- 层次遍历二叉树
- 层次遍历二叉树
- 二叉树层次遍历
- 二叉树 层次遍历
- 二叉树层次遍历
- 层次遍历二叉树
- 二叉树层次遍历
- 层次遍历二叉树
- 二叉树层次遍历
- 二叉树层次遍历
- 层次遍历二叉树
- 二叉树层次遍历
- 二叉树层次遍历
- 层次遍历 二叉树
- 层次遍历二叉树
- 层次遍历二叉树
- 层次遍历二叉树
- 层次遍历二叉树
- react native Navigator 属性传参应用
- CSDN日报20170508 ——《面试官谈游戏入行——面试和信仰》
- Android 手写数据库框架
- 基于proteus的51单片机仿真实例五十一、基于P2口的流水灯
- bzoj1105 [POI2007]石头花园SKA
- 层次遍历二叉树
- CF
- 使用word2vec模型乱码不可用的解决方法
- Linux shell 脚本攻略学习笔记6
- 欢迎使用CSDN-markdown编辑器
- jdbc将文本文档从数据库读出来
- 彻底弄懂HTTP缓存机制及原理
- 2017中国大学生程序设计竞赛
- 10344UVA算23点