剑指offer笔记——面试题6:从尾到头打印链表
问题描述:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,输入前序遍历序列{1, 2, 4, 7, 3, 5, 6, 8}和中序遍历序列{4, 7, 2, 1, 5, 3, 8, 6}
代码:
#include <iostream>
#include <stdexcept>
struct BinaryTreeNode
{
int data;
BinaryTreeNode *leftChild;
BinaryTreeNode *rightChild;
};
/**
* 二叉树前序遍历
*/
void PreTravel(BinaryTreeNode *tree)
{
if(tree)
{
std::cout << tree->data << '\t';
PreTravel(tree->leftChild);
PreTravel(tree->rightChild);
}
}
/**
* 二叉树后序遍历
*/
void PostTravel(BinaryTreeNode *tree)
{
if(tree)
{
PostTravel(tree->leftChild);
PostTravel(tree->rightChild);
std::cout << tree->data << '\t';
}
}
/**
* 二叉树中序遍历
*/
void InorderTravel(BinaryTreeNode *tree)
{
if(tree)
{
InorderTravel(tree->leftChild);
std::cout << tree->data << '\t';
InorderTravel(tree->rightChild);
}
}
/**
* 通过前序遍历和中序遍历的结果,重建二叉树
* @param preorder 前序遍历序列指针
* @param inorder 中序遍历序列指针
* @param length 遍历序列数组长度
* @return 返回重建的二叉树的根节点指针
*/
BinaryTreeNode* Construct(int *preorder, int *inorder, int length)
{
if(preorder == nullptr || inorder == nullptr || length <= 0)
return nullptr;
// 前序遍历的第一个元素值为根节点的值
BinaryTreeNode* root = new BinaryTreeNode;
root->data = preorder[0];
root->leftChild = root->rightChild = nullptr;
if(length == 1)
return root;
// 寻找中序遍历序列中的根节点位置
int leftLength;
for(leftLength = 0; leftLength < length && inorder[leftLength] != preorder[0]; leftLength++)
;
// 抛出异常将终止当前的函数,并把控制权转移给能处理该异常的代码
std::logic_error e("Invalid input");
if(inorder[leftLength] != preorder[0])
throw std::exception(e);
// 构建左子树
if(leftLength > 0)
root->leftChild = Construct(&preorder[1], inorder, leftLength);
// 构建右子树
if(leftLength < length-1)
root->rightChild = Construct(&preorder[leftLength+1], &inorder[leftLength+1], length-leftLength-1);
return root;
}
int main()
{
int preorder[] = {1, 2, 4, 7, 3, 5, 6, 8};
int inorder[] = {4, 7, 2, 1, 5, 3, 8, 6};
BinaryTreeNode *head = Construct(preorder, inorder, sizeof(preorder)/sizeof(int));
PreTravel(head);
std::cout << std::endl;
PostTravel(head);
std::cout << std::endl;
InorderTravel(head);
std::cout << std::endl;
}
运行结果: