线索二叉树

  • 线索二叉树结构
lChildlTagdatarTagrChild
lTag:0左孩子,1前驱
rTag:0右孩子,1后继
//代码结构
typedef struct ThreadNode {
    ElemType data;
    ThreadNode *lChild, *rChild;
    int lTag, rTag;
} ThreadNode, *ThreadTree;
  • 中序构造线索二叉树

按照中序遍历,初始化pre = NULL,pre指向上一个访问的结点,p指向当前访问的结点。
若p左指针为NULL,则 p->lChild = pre
若pre的右指针为NULL,则 pre->rChild = p

//中序构造线索二叉树
typedef struct ThreadNode {
    ElemType data;
    ThreadNode *lChild, *rChild;
    int lTag, rTag;
} ThreadNode, *ThreadTree;

void CreateInThread(ThreadTree tree) {
    ThreadTree pre;
    if (tree != NULL) {
        InThread(tree, pre);
        pre->rChild = NULL;
        pre->rTag = 1;
    }
}

void InThread(ThreadTree &p, ThreadTree &pre) {
    if (p != NULL) {
        InThread(p->lChild, pre);//①
        //=========>>>
        if (p->lChild == NULL) {
            p->lChild = pre;
            p->lTag = 1;
        }
        if (pre->rChild == NULL) {
            pre->rChild = p;
            pre->rTag = 1;
        }
        pre = p;
        //<<<=========	②
        InThread(p->rChild, pre);//③
    }
}
  • 中序遍历线索二叉树
//中序遍历线索二叉树
ThreadNode *firstNode(ThreadNode *p) {
    while (p->lTag == 0) p = p->lChild;
    return p;
}

ThreadNode *nextNode(ThreadNode *p) {
    if (p->rTag == 0) return firstNode(p->rChild);
    else return p->rChild;
}

void inOrder(ThreadNode *tree) {
    ThreadNode *p = firstNode(tree);
    while (p != NULL) {
        cout << p->data << endl;
        p = nextNode(p);
    }
}
  • 构造:前序和后序线索二叉树

前序和后序二叉树构造只需改变位置成②①③;①③②;

  • 前序和后序构造的线索二叉树的遍历?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值