要求
- 給出一個二叉樹前序的遍歷結果(數組),結果中包含有空結點(空結點用’#’表示),還原這個二叉樹。
- 給出一個二叉樹前序和中序的遍歷結果,不包含空結點,還原這個二叉樹。
思考
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);
}