数据结构---还原一个二叉树

本文介绍了如何根据带有空结点的前序遍历结果,以及二叉树的前序和中序遍历结果来还原二叉树。通过递归方法实现树的构造,讨论了不同情况下的处理策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要求

  • 给出一个二叉树前序的遍历结果(数组),结果中包含有空结点(空结点用’#’表示),还原这个二叉树。
  • 给出一个二叉树前序和中序的遍历结果,不包含空结点,还原这个二叉树。

思考

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值