09线索二叉树的创建和遍历

实验目的:

⑴ 熟悉线索二叉树的定义和基本操作

⑵ 掌握线索二叉树的链式存储结构设计与基本操作的实现

实验内容:

1、采用书上第 133 页定义的线索二叉树的线索链表存储表示,编程实现线索二叉树的下列基本操作。

1)建立先序线索二叉树

2)建立中序线索二叉树

3)建立后序线索二叉树

4)先序遍历线索二叉树

5)中序遍历线索二叉树

6)后序遍历线索二叉树

程序清单:

#include<iostream>

using namespace std;

#include<malloc.h>

#define OK 1

#define ERROR 0

#define OVERFLOW -2

typedef int Status;

typedef char TElemType;

typedef enum { Link, Thread }PointerTag;

typedef struct BiThrTNode

{

    TElemType data;

    BiThrTNode* lchild, * rchild, * Pparent;

    PointerTag LTag, RTag;

}BiThrTNode, * BiThrTree;

BiThrTree pre1 = NULL;

BiThrTree pre2 = NULL;

BiThrTree pre3 = NULL;

Status CreateBiThrTree(BiThrTree& T)

{

    char ch;

    cin >> ch;

    if (ch == '#')

    {

         T = NULL;

    }

    else

    {

         T = (BiThrTNode*)malloc(sizeof(BiThrTNode));

         if (!T)

             exit(OVERFLOW);

         T->LTag = Link;

         T->RTag = Link;

         T->data = ch;

         CreateBiThrTree(T->lchild);

         CreateBiThrTree(T->rchild);

    }

    return OK;

}

//先序线索化

void PreThreading(BiThrTree& p)

{

    if (p)

    {

         if (p->lchild == NULL)

         {

             p->lchild = pre1;

             p->LTag = Thread;

         }

         if (pre1 != NULL && pre1->rchild == NULL)

         {

             pre1->rchild = p;

             pre1->RTag = Thread;

         }

         pre1 = p;

         if (p->LTag != Thread)

             PreThreading(p->lchild);

         if (p->RTag != Thread)

             PreThreading(p->rchild);

    }

}

Status PreOrderThreading(BiThrTree& T)

{

    if (T)

    {

         PreThreading(T);

         pre1->rchild = NULL;

         pre1->RTag = Thread;

    }

    return OK;

}

Status PreOrderTraverse_Thr(BiThrTree T)

{

    if (T)

    {

         cout << T->data;

         if (T->LTag != Thread)

             PreOrderTraverse_Thr(T->lchild);

         if (T->RTag != Thread)

             PreOrderTraverse_Thr(T->rchild);

    }

    return OK;

}

void InThreading(BiThrTree p)

{

    if (p)

    {

         InThreading(p->lchild);

         if (!p->lchild)

         {

             p->LTag = Thread;

             p->lchild = pre2;

         }

         if (pre2 && !pre2->rchild)

         {

             pre2->RTag = Thread;

             pre2->rchild = p;

         }

         pre2 = p;

         InThreading(p->rchild);

    }

}

//二叉树线索化

Status InOrderThreading(BiThrTree& Thrt, BiThrTree T)

{

    if (!(Thrt = (BiThrTree)malloc(sizeof(BiThrTNode))))

         exit(OVERFLOW);

    Thrt->rchild = Thrt;

    Thrt->RTag = Link;

    if (!T)

    {

         Thrt->lchild = Thrt;

         Thrt->LTag = Link;

    }

    else

    {

         pre2 = Thrt;

         Thrt->lchild = T;

         Thrt->LTag = Link;

         InThreading(T);

         pre2->rchild = Thrt;

         pre2->RTag = Thread;

         Thrt->rchild = pre2;

    }

    return OK;

}

Status InOrderTraverse_Thr(BiThrTree T)

{

    BiThrTree p;

    p = T->lchild;

    while (p != T)

    {

         while (p->LTag == Link)

         {

             p = p->lchild;

         }

         cout << p->data;

         while (p->RTag == Thread && p->rchild != T)

         {

             p = p->rchild;

             cout << p->data;

         }

         p = p->rchild;

    }

    return OK;

}

Status CreateBiThrTree1(BiThrTree& T, BiThrTree parent)

{

    char ch;

    cin >> ch;

    if (ch == '#')

    {

         T = NULL;

    }

    else

    {

         T = (BiThrTNode*)malloc(sizeof(BiThrTNode));

         if (!T)

             exit(OVERFLOW);

         T->LTag = Link;

         T->RTag = Link;

         T->Pparent = parent;

         T->data = ch;

         CreateBiThrTree1(T->lchild, T);

         CreateBiThrTree1(T->rchild, T);

    }

    return OK;

}

//后序线索化

void PostThreading(BiThrTree p)

{

    if (p)

    {

         PostThreading(p->lchild);

         PostThreading(p->rchild);

         if (!p->lchild)

         {

             p->lchild = pre3;

             p->LTag = Thread;

         }

         if (pre3 && !pre3->rchild)

         {

             pre3->rchild = p;

             pre3->RTag = Thread;

        }

         pre3 = p;

    }

}

Status PostOrderThreading(BiThrTree& Thrt, BiThrTree T)

{

    if (!(Thrt = (BiThrTree)malloc(sizeof(BiThrTNode))))

         exit(OVERFLOW);

    Thrt->rchild = Thrt;

    Thrt->RTag = Link;

    if (!T)

    {

         Thrt->lchild = Thrt;

         Thrt->LTag = Link;

    }

    else

    {

         pre3 = Thrt;

         Thrt->lchild = T;

         Thrt->LTag = Link;

         PostThreading(T);

    }

    return OK;

}

Status PostOrderTraverse_Thr(BiThrTree T)

{

    BiThrTree p;

    p = T->lchild;

    BiThrTree q = NULL;

    while (p != NULL)

    {

         while (p->lchild != q && p->LTag == Link)

         {

             p = p->lchild;

         }

         while (p && p->RTag == Thread)

         {

             cout << p->data;

             q = p;

             p = p->rchild;

         }

         if (p == T->lchild)

         {

             cout << p->data;

             return OK;

         }

         while (p && p->rchild == q)

         {

             cout << p->data;

             q = p;

             p = p->Pparent;

         }

         if (p && p->RTag == Link)

         {

             p = p->rchild;

         }

    }

    return OK;

}

int main()

{

    BiThrTree T;

    cout << "创建线索二叉树,按先序次序输入线索二叉树中的结点的值:" << endl;

    CreateBiThrTree(T);

    if (PreOrderThreading(T) == OK)

         cout << "成功建立先序线索化链表!" << endl;

    cout << "先序遍历线索二叉树,结果是:" << endl;

    PreOrderTraverse_Thr(T);

    cout << endl;

    BiThrTree T1, Thrt1;

    cout << "创建线索二叉树,按先序次序输入线索二叉树中的结点的值:" << endl;

    CreateBiThrTree(T1);

    if (InOrderThreading(Thrt1, T1) == OK)

         cout << "成功建立中序线索化链表!" << endl;

    cout << "中序遍历线索二叉树,结果是:" << endl;

    InOrderTraverse_Thr(Thrt1);

    cout << endl;

    BiThrTree T2, Thrt2;

    BiThrTree parent = NULL;

    cout << "创建线索二叉树,按先序次序输入线索二叉树中的结点的值:" << endl;

    CreateBiThrTree1(T2, parent);

    if (PostOrderThreading(Thrt2, T2) == OK)

         cout << "成功建立后序线索化链表!" << endl;

    cout << "后序遍历线索二叉树,结果是:" << endl;

    PostOrderTraverse_Thr(Thrt2);

    cout << endl;

    return 0;

}

运行情况:

实验体会:

通过先序、中序、后序二叉树的线索化,更加理解了二叉树的遍历过程和算法,熟悉了线索二叉树

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是基于链表实现的二叉树建立和遍历的代码: ```c #include <stdio.h> #include <stdlib.h> struct Node { int data; struct Node *left; struct Node *right; }; void inorder(struct Node *root) { if (root != NULL) { inorder(root->left); printf("%d ", root->data); inorder(root->right); } } void preorder(struct Node *root) { if (root != NULL) { printf("%d ", root->data); preorder(root->left); preorder(root->right); } } void postorder(struct Node *root) { if (root != NULL) { postorder(root->left); postorder(root->right); printf("%d ", root->data); } } struct Node* newNode(int data) { struct Node* node = (struct Node*)malloc(sizeof(struct Node)); node->data = data; node->left = NULL; node->right = NULL; return node; } struct Node* insert(struct Node* node, int data) { if (node == NULL) { return newNode(data); } if (data < node->data) { node->left = insert(node->left, data); } else if (data > node->data) { node->right = insert(node->right, data); } return node; } int main() { struct Node *root = NULL; root = insert(root, 50); insert(root, 30); insert(root, 20); insert(root, 40); insert(root, 70); insert(root, 60); insert(root, 80); printf("Inorder traversal: "); inorder(root); printf("\nPreorder traversal: "); preorder(root); printf("\nPostorder traversal: "); postorder(root); return 0; } ``` 上述代码中,`Node` 结构体定义了二叉树的节点,包括节点的值、左子节点和右子节点。`newNode` 函数用于创建一个新的节点。`insert` 函数用于将一个节点插入到二叉树中。 `inorder`、`preorder` 和 `postorder` 分别用于实现中序遍历、前序遍历和后序遍历。在主函数中,我们将数据插入二叉树中,并按照不同的方式遍历输出。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值