要求
- 给出一个二叉树前序的遍历结果(数组),结果中包含有空结点(空结点用’#’表示),还原这个二叉树。
- 给出一个二叉树前序和中序的遍历结果,不包含空结点,还原这个二叉树。
思考
1.给出带有空结点的前序遍历结果还原二叉树
我们用递归的方法实现
实现
//@brief 根据先序遍历结果(带有空字符标记)
// 构造一棵树
//@param array[] 先序遍历的结果,加上空字符标记
//@param size 数组的大小
//@param null_node 空字符标记
TreeNode* _TreeCreate(TreeNodeType array[],size_t size,TreeNodeType null_node,size_t* index)
{
if(index == NULL)
{
//非法输入
return NULL;
}
if(*index >= size)
{
//树已经构建完了,index已经到了数组的末尾
return NULL;
}
if(array[*index] == null_node)
{
//前序遍历结果第一个就是空字符,说明是空树
return NULL;
}
TreeNode* root = CreateTreeNode(array[*index]);
(*index)++;
root->lchild = _TreeCreate(array,size,null_node,index);
(*index)++;
root->rchild = _TreeCreate(array,size,null_node,index);
return root;
}
TreeNode* TreeCreate(TreeNodeType array[], size_t size, TreeNodeType null_node)
{
//当前读到了数组的第几个元素
size_t index = 0;
return _TreeCreate(array,size,null_node,&index);
}
2.给出二叉树前序和中序遍历结果,不带空结点,还原二叉树
//找出前序遍历中的元素在中序遍历数组中的下标
size_t Find(TreeNodeType to_find, TreeNodeType in_order[], size_t left, size_t right)
{
size_t i = left;
for(;i < right; i++)
{
if(in_order[i] == to_find)
{
return i;
}
}
return (size_t)-1;
}
//分模块实现
TreeNode* _ReBulidTree(TreeNodeType pre_order[], size_t pre_size,size_t* index, TreeNodeType in_order[],
size_t in_left, size_t in_right)
{
if(in_left >= in_right)
{
return NULL;
}
if(*index >= pre_size)
{
//先序遍历完了,直接返回
return NULL;
}
//取出当前元素
TreeNode* newNode = CreateTreeNode(pre_order[*index]);
//查找当前元素在中序遍历数组中的下标,也就是确认它的左子树与右子树范围
size_t cur_in_order_nu = Find(pre_order[*index],in_order,in_left,in_right);
assert( cur_in_order_nu != (size_t)-1 );
(*index)++;
newNode->lchild = _ReBulidTree(pre_order,pre_size,index,in_order,in_left,cur_in_order_nu);
newNode->rchild = _ReBulidTree(pre_order,pre_size,index,in_order,cur_in_order_nu+1,in_right);
return newNode;
}
//给出前序遍历和中序遍历结果(不带空节点),还原二叉树
TreeNode* ReBulidTree(TreeNodeType pre_order[], size_t pre_size, TreeNodeType in_order[], size_t in_size)
{
if(pre_size != in_size)
{
return NULL;
}
size_t index = 0;
return _ReBulidTree(pre_order,pre_size,&index,in_order,0,in_size);
}