剑指offer重建二叉树

来源:互联网 发布:淘宝优站今日特价专场 编辑:程序博客网 时间:2024/06/06 06:30
using namespace std;
struct BinaryTreeNode
{
 int value;
 BinaryTreeNode* left;
 BinaryTreeNode* right;
};
BinaryTreeNode* ConstrctCore
(
 int *startPreOrder, int *endPreOrder,
 int *startInOrder, int *endInorder
)
{
 //前序遍历序列的第一个数字是根节点的值
 int rootValue = startPreOrder[0];
 BinaryTreeNode* root = new BinaryTreeNode();
 root->value = rootValue;
 root->left = root->right = NULL;
 if (startPreOrder == endPreOrder)
 {
  if (startInOrder == endInorder && *startPreOrder == *startInOrder)
   return root;
  else
   throw exception("Invalid input");
 }
 //在中序遍历中找到根节点的值
 int* rootInOrder = startInOrder;
 while (rootInOrder <= endInorder &&*rootInOrder != rootValue)
  ++rootInOrder;
 if (rootInOrder == endInorder&&*rootInOrder != rootValue)
  throw exception("Invalid input.");
 int leftLength = rootInOrder - startInOrder;
 int *leftPreOrderEnd = startPreOrder + leftLength;
 if (leftLength > 0)
 {
  //构建左子树
  root->left = ConstrctCore(startPreOrder + 1, leftPreOrderEnd, startInOrder, rootInOrder - 1);
 }
 if (leftLength < endPreOrder - startPreOrder)
 {
  //构建右子树
  root->right = ConstrctCore(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 ConstrctCore(preOrder, preOrder + length - 1, inOrder, inOrder + length - 1);
}
int main()
{
 int preOrder[8] = { 1,2,4,7,3,5,6,8 };
 int inOrder[8] = { 4,7,2,1,5,3,8,6 };
 BinaryTreeNode *han;
 han = Construct(preOrder, inOrder, 8);
 return 0;
}
原创粉丝点击