• 【数据结构】中序遍历线索二叉树


    昨天写了个二叉树遍历,自以为对二叉树很了解了。自大的认为线索二叉树不过是加了点线索而已,不足挂齿。可是当真的自己编程序写的时候才发现完全不是那么容易。在有线索的情况下,如何判别Link类型的下一节点,如何不用栈跳过已访问节点搞得脑子晕晕的。 折腾一个晚上,才根据书上把线索二叉树的建立、中序遍历给写出来。要回去继续好好的理清关系。

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef enum PointerTag{Link, Thread};
    
    typedef struct BiThrNode
    {
        int data;
        struct BiThrNode *lchild, *rchild;
        PointerTag LTag, RTag;
    }BiThrNode, *BiThrTree;
    
    int createBinaryTree(BiThrTree &T)  //线索二叉树建立
    {
        int ch;
        scanf("%d", &ch);
    
        if(ch != 0)
        {
            T = (BiThrTree)malloc(sizeof(BiThrNode));
            T->data = ch;
            createBinaryTree(T->lchild);
            createBinaryTree(T->rchild);
        }
        else
        {
            T = NULL;
        }
        return 0;
    }
    
    int InTreading(BiThrTree T, BiThrTree &pre) //中序线索建立 内
    {
        if(T != NULL)
        {
            InTreading(T->lchild, pre);
            if(T->lchild == NULL){ T->LTag = Thread; T->lchild = pre;}
            else{ T->LTag = Link;}
            if(pre->rchild == NULL){ pre->RTag = Thread; pre->rchild = T;}
            else{ T->RTag = Link;}
            pre = T;
            InTreading(T->rchild, pre);
        }
        return 0;
    }
    int InOrderThreading(BiThrTree & Thrt, BiThrTree T) //中序线索建立 外
    {
        BiThrTree pre;
        Thrt= (BiThrTree)malloc(sizeof(BiThrNode));
        Thrt->LTag = Link; Thrt->RTag = Thread;
        Thrt->rchild = Thrt;
        if(T == NULL) Thrt->lchild = Thrt;
        else
        {
            Thrt->lchild = T; pre = Thrt;
            InTreading(T, pre);
            pre->rchild = Thrt; pre->RTag = Thread;
            Thrt->rchild = pre;
    
        }
        return 0;
    }
    
    int visit(int data)
    {
        printf("%d ", data);
        return 0;
    }
    
    int InOrderTraverse_Thr(BiThrTree T) //中序非递归线索二叉树遍历
    {
        BiThrTree p = T->lchild;
        while(p != T)
        {
            while(p->LTag == Link) p = p->lchild;
            visit(p->data);
            while(p->RTag == Thread && p->rchild != T)
            {
                p = p->rchild; visit(p->data);
            }
            p = p->rchild;
        }
        return 0;
    }
    
    int main()
    {
        BiThrNode TT;
        BiThrTree T, Thrt;
        
        createBinaryTree(T);
        InOrderThreading(Thrt, T);
        InOrderTraverse_Thr(Thrt); //注意遍历的时候要带上头结点
        return 0;
    }
  • 相关阅读:
    ExtJS实战(3)spring
    在 Lotus Domino 7 应用程序中利用 IBM DB2 集成特性
    ExtJS实战(2)hibernate
    ExtJS实战(4)struts
    春节后找工作被面试的经历,好岗位分享给还在找工作中的软件开发爱好者们【转】
    hack专讲
    春节后面试别人的经历总结之二,好岗位分享给还在找工作中的软件开发爱好者们【转】
    asp 去除HTML格式
    创业型公司或发展中公司请不要随意给员工开空头支票~~!!!
    可展开滚动的QQ客服代码【蓝底客服中心】
  • 原文地址:https://www.cnblogs.com/dplearning/p/3734613.html
Copyright © 2020-2023  润新知