0
点赞
收藏
分享

微信扫一扫

线索二叉树的先序和中序创建

年迈的代码机器 2022-05-03 阅读 51
using namespace std;
#define ElemType int

typedef struct ThreadNode {
    ElemType data;
    struct ThreadNode *left, *right;
    int rtag, ltag;
}ThreadNode, *ThreadTree;

//全局变量指向q的前驱
ThreadNode *pre = nullptr;

void visited(ThreadNode *q) {
    //左子树为空,建立前驱
    if (q->left == nullptr) {
        q->left = pre;
        q->ltag = 1;
    }
    //前驱的右子树为空,建立后继
    if (pre != nullptr && pre->right == nullptr) {
        pre->right = q;
        pre->rtag = 1;
    }
    pre = q;
}

void inOrder(ThreadTree L) {
    if (L == nullptr)
        return;
    inOrder(L->left);
    visited(L);
    inOrder(L->right);
}

void preOrder(ThreadTree L) {
    if (L == nullptr)
        return;
    visited(L);
    if (L->ltag == 0) //left不是前驱线索的时候
        preOrder(L->left);
    preOrder(L->right);
}

//中序遍历建立线索二叉树
void CreateTreeInorder(ThreadTree T) {
    //初始化pre指针
    pre = nullptr;
    if (T != nullptr) {
        inOrder(T);
        //将最后一个结点的tag设置为1
        if (pre->right == nullptr)
            pre->rtag = 1;
    }
}

//先序遍历建立线索二叉树
void CreateTreePreOrder(ThreadTree T) {
    pre = nullptr;
    if (T != nullptr) {
        preOrder(T);
        if (pre->right == nullptr)
            pre->rtag = 1;
    }
}
举报

相关推荐

0 条评论