47-线索二叉树测试代码

线索二叉树测试代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


typedef char ElemType;

//二叉树结点
typedef struct BINARYNODE{

    ElemType data;          //数据域
    int ltag  ,  rtag;      //增加的线索标志
    struct BINARYNODE *lchild;  //左孩子或线索指针
    struct BINARYNODE *rchild;  //右孩子或线索指针

}BinaryNode;

//表示p的前驱节点
BinaryNode *pre;

void Thread(BinaryNode *&p)
{
    if(p != NULL)
    {
        //递归调用左子树线索化
        Thread(p->lchild);

        //如果lchild指针为空,则线索化(指向前驱节点)
        if(p->lchild == NULL)
        {
            p->lchild = pre;
            p->ltag = 1;
        }
        else
        {
            p->ltag = 0;
        }

        //当rchild指针为空,则线索化(指向后继节点)
        if(pre->rchild == NULL)
        {
            pre->rchild = p;
            pre->rtag = 1;
        }
        else
        {
            pre->rtag = 0;
        }
        //把pre移动到p的位置
        pre = p;

        //递归调用将右子树线索化
        Thread(p->rchild);
    }
}

BinaryNode *CreaThread(BinaryNode *b)
{
    BinaryNode *root;
    //创建头结点
    root = (BinaryNode *)malloc(sizeof(BinaryNode));
    root->ltag = 0;
    root->rtag = 1;
    root->rchild = b;

    //判断是否为空树
    if(b == NULL)
    {
        //头结点的lchild指针指向自己
        root->lchild = root;
    }
    else
    {
        root->lchild = b;
        //pre是*p的前驱节点,供加线索用,一开始指向头结点
        pre = root;
        //中序遍历线索化二叉树,找下一个节点
        Thread(b);
        //最后处理,改变为指向头节点的线索
        pre->rchild = root;
        //同时改变标志
        pre->rtag = 1;
        // 将头节点的rchild改变为线索
        root->rchild = pre;
    }
    return root;
}


void ThInOrder(BinaryNode *tb)
{
    if(tb == NULL)
    {
        return;
    }
    //指向根节点 
    BinaryNode  *p = tb->lchild;

    //p不等于头结点
    while(p != tb)
    {
        //访问开始节点(最左下的节点)
        while(p->ltag == 0)
        {
            p = p->lchild;
        }
        printf("%c" , p->data);
        //判断p的rchild指针是否有线索,且该线索不是头结点
        while(p->rtag == 1 && p->rchild != tb)
        {
            //有就访问线索
            p = p->rchild;
            printf("%c" , p->data);
        }
        //p指向右孩子节点
        p = p->rchild;
    }
}

int main(void)
{
    BinaryNode *node = NULL;

    //创建节点
    BinaryNode node1 = { 'A', 0 , 0 , NULL, NULL };
    BinaryNode node2 = { 'B', 0 , 0 , NULL, NULL };
    BinaryNode node3 = { 'C', 0 , 0 ,  NULL, NULL };
    BinaryNode node4 = { 'D', 0 , 0 ,  NULL, NULL };
    BinaryNode node5 = { 'E', 0 , 0 ,  NULL, NULL };
    BinaryNode node6 = { 'F', 0 , 0 ,  NULL, NULL };
    BinaryNode node7 = { 'G', 0 , 0 ,  NULL, NULL };

    //建立二叉树
    node1.lchild = &node2;
    node1.rchild = &node3;
    node2.lchild = &node4;
    node3.lchild = &node5;
    node3.rchild = &node6;
    node4.rchild = &node7;


    printf("中序遍历线索化二叉树:");
    //建立线索二叉树
    node = CreaThread(&node1);
    //以中序遍历线索二叉树
    ThInOrder(node);
    printf("\n\n");
    return 0;
}



测试结果:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是线索二叉树的C语言代码示例: ```c #include <stdio.h> #include <stdlib.h> // 定义线索二叉树结构体 typedef struct ThreadedBinaryTreeNode { int data; struct ThreadedBinaryTreeNode *left, *right; int ltag, rtag; // 0表示指向左右子树,1表示指向前驱或后继 } ThreadedBinaryTreeNode, *ThreadedBinaryTree; // 中序遍历线索化 void InThread(ThreadedBinaryTree p, ThreadedBinaryTree *pre) { if (p != NULL) { InThread(p->left, pre); if (p->left == NULL) { p->left = *pre; p->ltag = 1; } if (*pre != NULL && (*pre)->right == NULL) { (*pre)->right = p; (*pre)->rtag = 1; } *pre = p; InThread(p->right, pre); } } // 创建线索二叉树 void CreateInThread(ThreadedBinaryTree *root) { ThreadedBinaryTree pre = NULL; if (*root != NULL) { InThread(*root, &pre); pre->right = NULL; pre->rtag = 1; } } // 中序遍历线索二叉树 void InOrderTraverse(ThreadedBinaryTree root) { ThreadedBinaryTree p = root; while (p != NULL) { while (p->ltag == 0) { p = p->left; } printf("%d ", p->data); while (p->rtag == 1 && p->right != NULL) { p = p->right; printf("%d ", p->data); } p = p->right; } } // 测试 int main() { // 创建线索二叉树 ThreadedBinaryTree root = (ThreadedBinaryTree)malloc(sizeof(ThreadedBinaryTreeNode)); root->data = 1; root->ltag = root->rtag = 0; root->left = (ThreadedBinaryTree)malloc(sizeof(ThreadedBinaryTreeNode)); root->left->data = 2; root->left->ltag = root->left->rtag = 0; root->left->left = root->left->right = NULL; root->right = (ThreadedBinaryTree)malloc(sizeof(ThreadedBinaryTreeNode)); root->right->data = 3; root->right->ltag = root->right->rtag = 0; root->right->left = (ThreadedBinaryTree)malloc(sizeof(ThreadedBinaryTreeNode)); root->right->left->data = 4; root->right->left->ltag = root->right->left->rtag = 0; root->right->left->left = root->right->left->right = NULL; root->right->right = (ThreadedBinaryTree)malloc(sizeof(ThreadedBinaryTreeNode)); root->right->right->data = 5; root->right->right->ltag = root->right->right->rtag = 0; root->right->right->left = root->right->right->right = NULL; CreateInThread(&root); // 中序遍历线索二叉树 InOrderTraverse(root); return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值