數據結構---還原一個二叉樹

要求

  • 給出一個二叉樹前序的遍歷結果(數組),結果中包含有空結點(空結點用’#’表示),還原這個二叉樹。
  • 給出一個二叉樹前序和中序的遍歷結果,不包含空結點,還原這個二叉樹。

思考

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);
}   

發佈了50 篇原創文章 · 獲贊 26 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章