搜索二叉树(很多至今不懂的地方)

#include<stdio.h>
#include<stdlib.h>



typedef enum { link, thread } PointerTag;

//创建树的一个节点
typedef struct BiNode {
    char data;
    struct BiNode *lchild;
    struct BiNode *rchild;
    PointerTag ltag;
    PointerTag rtag;
}BitrNode, *BiTree;

//创建一个全局变量,始终指向刚刚访问的结点
BiTree pre; //这里可以看出  这是一个指针

            //创建一棵树 运用前序遍历创建 要注意区分一级指针和二级指针
CreateThree(BiTree *T) {
    char c;
    scanf("%c", &c);
    if (' ' == c) {
        (*T) = NULL;
    }
    else {
        *T = (BitrNode *)malloc(sizeof(BitrNode));
        (*T)->data = c;
        (*T)->ltag = link; //这里先假设是成立的
        (*T)->rtag = link;
        CreateThree(&(*T)->lchild); // 这里函数的接口是个二层指针。因此这里应该是一个地址
        CreateThree(&(*T)->rchild);

    }

}

//进行中序遍历,线索化(修改ltag和指向对象)

Inthreading(BiTree  T) {
    if (T != NULL) {
        Inthreading((T)->lchild); //递归,一直递归到最左的叶子

        if ((T)->lchild == NULL) {
            (T)->ltag = thread;
            (T)->lchild = pre;
        }
        if (pre->rchild == NULL) {
            pre->ltag = thread;
            pre->rchild = T;
        }
        pre = T;   //这一句有待考证
        Inthreading((T)->rchild); //递归,一直递归到最右的叶子

    }

}

InOrderThreading(BiTree p, BiTree T) {

    p = (BiTree)malloc(sizeof(BitrNode));
    p->ltag = link;

    p->rtag = thread;

    p->rchild = p; // 不懂啊
    if (!T)
    {
        p->lchild = p;
    }
    else {
        p->lchild = T;
        pre = p;
        Inthreading(T);
        pre->rchild = p;
        pre->rtag = thread;
        p->rchild = pre;
    }

}




int main()
{
    BiTree T;

    CreateThree(&T);
    InOrderThreading(pre, T);
}
原文地址:https://www.cnblogs.com/xiaochige/p/7692833.html