如何将二叉树线索化

线索化存在的必要原因:对于一颗二叉树,遍历是一个经常性的操作,但是如果我们每次遍历时,都要通过递归或者通过栈实现二叉树的遍历,在遍历时需要进行很多判断,并且一定程度上浪费了一些空间和时间,因此我们考虑是否可以记录下其遍历时其”前驱”和”后继”。
方法:1.对每个二叉树节点增加两个字段”前驱”和”后继”来分别存储遍历过程中它的前一个节点位置和后一个节点位置,这种方式固然是方便,不过也不得不花费更多的空间来存储节点地址,这样一来,可能未能达到优化效果。
2.因为二叉树每个节点的左右子树可能不存在,指向其左右子树的指针为null,这个资源是完全可以被利用的,显然我们可以将节点左右子树指针为null的地方改为指向其”前驱”或者”后继”,但是这样我们就无法区分左右子树指针指向的是”子树”还是”前驱或后继”,所以我们要花费额外的两个bit来区分。
代码及代码说明
首先生成二叉树

typedef enum PointerTag{Link,Thread} PointerTag;//定义标签
typedef struct BiThrNode{
    int data;
    struct BiThrNode *lchirld,*rchild;
    PointerTag LTag,RTag;
}BiThrNode;
//层序生成二叉树
BiThrNode* CreateTree(){
    int arr[]={
  1,2,3,4,5,6,7};
    BiThrNode *root=(BiThrNode*)malloc(sizeof(BiThrNode));
    root->data=1;
    root->lchirld=root->rchild=NULL;
    BiThrNode** con[7]={};
    int r,l,idx;
    con[0]=&(root->lchirld);
    con[1]=&(root->rchild);
   
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值