还原二叉树的关键要点

近日因界面图形操作序列是一个二叉树,将该操作二叉树的先序和中序序列保存至数据库中后,应用下次启动需要恢复该二叉树。于是涉及一个在内存中还原二叉树的要求。
如何还原?我选择递归方式实现,互联网上对递归方式还原二叉树有很多文章。本人通过实际体验及反复实验,成功实现该功能。下面介绍几个要点:
一、节点指针赋值方式
要还原的二叉树每个节点的左指针和右指针,这两个指针在递归中得到赋值有两种方式,一种是将指针作为递归函数参数,另外一种是指针作为递归外的变量,等递归返回节点后再赋值给指针。具体来说,第一种算法是这样的:
void createAtwotree(Block *node,int preHx,int length)
{

createAtwotree(node->left,preHx+1,midHx);
createAtwotree(node->right,node->xh+1,node->xh+1);
}
第二种算法是这样的:
Node *createAtwotree(Block *node,int preHx,int length)
{

node->left=createAtwotree(preHx+1,midHx);
node->right->createAtwotree(node->xh+1,node->xh+1);
}
第一种算法无论这么做都无法实现,而第二种很容易实现。第一种算法失败的原因是指针作为递归传递参数,是没有保证的,因为节点分配的动态内存在不同情况下是不一样的,指针所指的内存又可能在应用运行中动态调整被释放掉;另外指针传递是指针变量而非指针指向的内存,所以在递归里给指针赋值,随着应用运行指针作为临时变量值也将被释放掉,导致二叉树无法建立。

二、算法中注意要点
第一,先序序列在递归中需要确定每次参与递归的序列起始和长度,这个不能搞错。
第二,中序序列可以每次全部序列都参加,不需要做特殊处理即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值