再谈二叉树:重建二叉树
来源:互联网 发布:淘宝店描述 编辑:程序博客网 时间:2024/05/29 14:26
题目是这样的:给出二叉树的前序遍历和后序遍历结果,存储在整型数组中。据此构建出该二叉树。
思路分析:主要考虑到遍历的特点,可以参考之前的一篇博客。我们可以根据前序遍历结果找到根节点,也就是前序遍历结果的第一个元素,然后在中序遍历结果中找到根节点,那么根节点的左边的元素就是左子树,右边的就是右子树,进而对这两部分递归构建~~
下面是代码,看一遍应该没问题的~~
//二叉树结点struct BinaryTreeNode { int m_nValue; BinaryTreeNode* left; BinaryTreeNode* right;};/************************************************************************//* 重建二叉树: 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。*//************************************************************************/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->right = root->left = 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->left = ConstructCore(startPreorder + 1, leftPreorderEnd, startInorder, rootInorder - 1); } if (leftLength < endPreorder - startPreorder) { //构建右子树 root->right = ConstructCore(leftPreorderEnd + 1, endPreorder, rootInorder + 1, endInorder); } root;}
0 0
- 再谈二叉树:重建二叉树
- 3.9重建二叉树
- 重建二叉树
- 二叉树重建
- 二叉树重建
- 二叉树的重建
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 二叉树重建
- 二叉树重建
- 重建二叉树
- 重建二叉树
- iOS之UIScrollView实现无限滚动,思路与代码
- D3D中SetTransform(D3DTS_VIEW)出现 0xC0000005: 读取位置 0x00000000 时发生访问冲突
- 有关宽字符wchar_t编码方式的问题
- 得到每个osd的放置组个数
- javaScript (一)数据类型
- 再谈二叉树:重建二叉树
- Http Method
- Android LayoutInflater原理分析,带你一步步深入了解View(一)
- 3105: [cqoi2013]新Nim游戏
- C语言中 malloc,calloc 和 realloc 函数之间的区别
- aop.php
- android开发步步为营之103:android分享音频视频图片和文字功能的实现
- opencv:多目标跟踪
- redhat 中 yum的安装以及软件源的更新