您的位置:首页 > Web前端

剑指offer:重建二叉树

2015-07-21 10:02 375 查看
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列为{1,2,4,7,3,5,6,8}和中序遍历的序列{4,7,2,1,5,3,8,6},则重建出下图所示的二叉树并输出它的头结点。


分析:前序遍历的第一个元素就是根节点的值
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;

}

[/code]

来自为知笔记(Wiz)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: