3. 中序线索二叉树

3. 中序线索二叉树

【问题描述】创建一棵二叉树,接着中序线索化该二叉树,然后编写相应函数遍历该中序线索二叉树

【编码要求】线索二叉树遍历过程中不能使用递归、不能使用栈。

【输入形式】二叉树拓展的前序遍历序列

【输出形式】中序遍历序列

【样例输入】AB#D##CE###

【样例输出】BDAEC

#include <iostream>
using namespace std;
#include <cstring>
struct node
{
    char data;
    node *lchild;
    node *rchild;
    int ltag, rtag;
};
char a[100];
node *build(int len, int &i)
{
    if (i < len && a[i] != '#')
    {
        node *r = new node;
        r->data = a[i];
        r->ltag = r->rtag = 0;
        r->lchild = build(len, ++i);
        r->rchild = build(len, ++i);
        return r;
    }
    else
        return NULL;
}
node *pre = NULL;
void build_thread(node *root)
{
    if (root == NULL)
        return;
    build_thread(root->lchild);
    if (root->lchild == NULL)
    {
        root->lchild = pre;
        root->ltag = 1;
    }
    if (pre != NULL && pre->rchild == NULL)
    {
        pre->rchild = root;
        pre->rtag = 1;
    }
    pre = root;
    build_thread(root->rchild);
}

node *left(node *p)
{
    while (p != NULL && p->ltag == 0 && p->lchild != NULL)
        p = p->lchild;
    return p;
}
void output(node *root)
{
    node *p = left(root);
    while (p != NULL)
    {
        cout << p->data;
        if (p->rtag == 1)
        {
            p = p->rchild;
        }
        else
        {
            p = left(p->rchild);
        }
    }
    return;
}

int main()
{
    ios::sync_with_stdio(false);
    cin >> a;
    int i = 0;
    node *r = build(strlen(a), i);
    build_thread(r);
    output(r);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是用C语言实现的代码: ```c #include<stdio.h> #include<stdlib.h> #include<stdbool.h> // 定义二叉树节点的结构体 struct TreeNode { char data; // 数据域 struct TreeNode* leftChild; // 左孩子指针 struct TreeNode* rightChild; // 右孩子指针 bool leftTag; // 左线索标志 bool rightTag; // 右线索标志 }; // 先序遍历创建二叉树 struct TreeNode* createBinaryTree() { char c; scanf("%c", &c); getchar(); // 读取输入字符后需要跳过回车符 if (c == '#') { // 如果输入#,表示该节点为空指针 return NULL; } struct TreeNode* root = (struct TreeNode*)malloc(sizeof(struct TreeNode)); // 创建根节点 root->data = c; root->leftChild = createBinaryTree(); // 递归创建左子树 root->rightChild = createBinaryTree(); // 递归创建右子树 return root; } // 中序线索化二叉树 void inOrderThreading(struct TreeNode* root, struct TreeNode** pre) { if (root == NULL) { // 如果是空树,直接返回 return; } inOrderThreading(root->leftChild, pre); // 递归线索化左子树 if (root->leftChild == NULL) { // 如果左孩子为空,将左孩子指针指向前驱节点 root->leftChild = *pre; root->leftTag = true; } if (*pre != NULL && (*pre)->rightChild == NULL) { // 如果前驱节点的右孩子为空,将前驱节点的右孩子指针指向当前节点 (*pre)->rightChild = root; (*pre)->rightTag = true; } *pre = root; // 更新前驱节点 inOrderThreading(root->rightChild, pre); // 递归线索化右子树 } // 获取中序线索二叉树的第一个节点 struct TreeNode* firstNode(struct TreeNode* root) { while (root->leftTag == false) { root = root->leftChild; } return root; } // 获取中序线索二叉树中节点的后继节点 struct TreeNode* nextNode(struct TreeNode* root) { if (root->rightTag == false) { // 如果右线索标志为false,表示有右孩子 return firstNode(root->rightChild); } else { // 如果右线索标志为true,表示没有右孩子,返回右线索指向的后继节点 return root->rightChild; } } // 通过找前驱的方式遍历中序线索二叉树 void inOrderTraverseByPredecessor(struct TreeNode* root) { while (root != NULL) { while (root->leftTag == false) { // 如果左线索标志为false,说明有左孩子,继续向左走 root = root->leftChild; } printf("%c ", root->data); // 输出当前节点 root = root->leftChild; // 向左孩子继续遍历 } printf("\n"); } // 通过找后继的方式遍历中序线索二叉树 void inOrderTraverseBySuccessor(struct TreeNode* root) { struct TreeNode* p = firstNode(root); // 获取第一个节点 while (p != NULL) { printf("%c ", p->data); // 输出当前节点 p = nextNode(p); // 获取当前节点的后继节点 } printf("\n"); } int main() { struct TreeNode* root = createBinaryTree(); // 创建二叉树 struct TreeNode* pre = NULL; inOrderThreading(root, &pre); // 中序线索化二叉树 printf("通过找前驱的方式遍历中序线索二叉树:"); inOrderTraverseByPredecessor(root); // 通过找前驱的方式遍历中序线索二叉树 printf("通过找后继的方式遍历中序线索二叉树:"); inOrderTraverseBySuccessor(root); // 通过找后继的方式遍历中序线索二叉树 return 0; } ``` 以上代码中,`createBinaryTree`函数用于创建二叉树,`inOrderThreading`函数用于中序线索化二叉树,`firstNode`函数用于获取中序线索二叉树的第一个节点,`nextNode`函数用于获取中序线索二叉树中节点的后继节点,`inOrderTraverseByPredecessor`函数用于通过找前驱的方式遍历中序线索二叉树,`inOrderTraverseBySuccessor`函数用于通过找后继的方式遍历中序线索二叉树
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wrong Ansewer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值