#include<iostream>
#include<vector>
#include<string.h>
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* Contruct(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)
//这是一个递归调用的函数,startPreorder表示每一个前序遍历子树的最左边,endPreorder表示每一个前序遍历子树的最右边,
//startInorder表示每一个中序遍历子树的最左边,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("Incalid 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;
}
int main()
{
int preorder[] = { 1, 2, 4, 7, 3, 5, 6, 8 };//前序遍历,中左右
int inorder[] = { 4, 7, 2, 1, 5, 3, 8, 6 };//中序遍历,左中有
int length = sizeof(preorder) / sizeof(preorder[0]);//二叉树的所有结点的个数
BinaryTreeNode* root;//根结点
root = Contruct(preorder, inorder, length);
return 0;
}
剑指offor面试题6:重建二叉树
最新推荐文章于 2022-04-19 16:36:18 发布