剑指Offer系列---(8)重建二叉树
来源:互联网 发布:ug8.0编程教程 编辑:程序博客网 时间:2024/05/21 06:31
1.题目描述:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出二叉树并输出它的头结点。二叉树结点的定义如下:
struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
};
2.源代码:
// Copyright (c) 2015年 skewrain. All rights reserved.#include <iostream>#include <stdio.h>using namespace std;struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;};BinaryTreeNode* Construct(int* preorder,int* inorder,int length);int main(int argc,char *argv[]){ int pre[8] = {1,2,4,7,3,5,6,8}; int in[8] = {4,7,2,1,5,3,8,6}; BinaryTreeNode *root = Construct(pre, in, 8); printf("根结点的值为:%d\n",root->m_nValue); return 0;}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(); } //在中序遍历中找到根节点的值 int* rootInorder = startInorder; while (rootInorder <= endInorder && *rootInorder != rootValue) { ++rootInorder; } if(rootInorder == endInorder && *rootInorder != rootValue) throw std::exception(); int leftLength = (int)(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;}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);}
0 0
- 剑指Offer系列---(8)重建二叉树
- 剑指offer系列源码-重建二叉树
- 【剑指offer系列】 重建二叉树___6
- 剑指offer系列之四:重建二叉树
- 剑指offer系列之4:重建二叉树
- 剑指Offer系列-面试题6:重建二叉树
- 【剑指offer-解题系列(4)】重建二叉树
- 剑指offer系列(5)——重建二叉树
- [剑指offer]重建二叉树
- 【剑指offer】重建二叉树
- 剑指offer--重建二叉树
- 剑指offer---重建二叉树
- 剑指Offer-重建二叉树
- 剑指offer:重建二叉树
- 剑指offer-重建二叉树
- 《剑指offer》重建二叉树
- 【剑指Offer】重建二叉树
- 剑指offer-重建二叉树
- 偶尔想法
- A.3字符串
- LeetCode题解:Add Binary
- servlet1
- for_each和generator,generator_n
- 剑指Offer系列---(8)重建二叉树
- Android xUtils框架(二) ViewUtils
- SURF VS SIFT
- PCB阻抗计算
- hdoj1043,eight
- android学习—context 和 getApplicationContext()
- Linux战地日记——简单命令
- SQL 自动清除7天前数据前收缩数据库
- activity