美文网首页
数据结构笔记-树

数据结构笔记-树

作者: Veahow | 来源:发表于2018-12-01 21:25 被阅读0次

    树 Tree

    一、存储

    • 伪代码
    typedef struct BiTNode{
        ElementType data;    // 结点元素数据
        struct BiTNode *lchild, *rchild;    // 左孩子右孩子指针
    }*BiTree;
    
    • C语言实例(部分代码)
    typedef int ElementType;
    
    typedef struct BiTNode{
        ElementType data;    // 结点元素数据
        struct BiTNode *lchild, *rchild;    // 左孩子右孩子指针
    }*BiTree;
    

    二、遍历/搜索

    1.先序遍历(DLR)

    • 伪代码
      (1)递归
    void PreOrder(BiTree T)
    {
        if(T != NULL){
            Visit(T);    // 访问根节点
            PreOrder(T->lchild);    // 递归遍历左孩子
            PreOrder(T->rchild);    // 递归遍历右孩子
        }
    }
    

    (2)非递归(使用栈)

    void PreOrder(BiTree T)
    {
        Stack S;
        InitStack(S);
        BiTree p = T;
        while(p || !isEmpty(S)){
            if(p){
                Push(S, p);
                Visit(p);
                p = p->lchild;
            }else{
                Pop(S, p);
                p = p->rchild;
            }    // else
        }    // while
    }
    

    2.中序遍历(LDR)

    • 伪代码
      (1)递归
    void InOrder(BiTree T)
    {
        if(T != NULL){
            PreOrder(T->lchild);    // 递归遍历左孩子
            Visit(T);    // 访问根节点
            PreOrder(T->rchild);    // 递归遍历右孩子
        }
    }
    

    (2)非递归(使用栈)

    void InOrder(BiTree T)
    {
        Stack S;
        InitStack(S);
        BiTree p = T;
        while(p || !isEmpty(S)){
            if(p){
                Push(S, p);
                p = p->lchild;
            }else{
                Pop(S, p);
                Visit(p);
                p = p->rchild;
            }    // else
        }    // while
    }
    

    3.后序遍历(LRD)

    • 伪代码
      (1)递归
    void PostOrder(BiTree T)
    {
        if(T != NULL){
            PreOrder(T->lchild);    // 递归遍历左孩子
            PreOrder(T->rchild);    // 递归遍历右孩子
            Visit(T);    // 访问根节点
        }
    }
    

    (2)非递归(使用栈)

    void PostOrder(BiTree T)
    {
        Stack S;
        InitStack(S);
        BiTree p = T, r = NULL;
        while(p || !isEmpty(S)){
            if(p){
                Push(S, p);
                p = p->lchild;
            }else{
                Top(S, p);
                if(p->rchild != NULL && p->rchild != r){
                    p = p->rchild;
                    Push(S, p);
                    p = p->lchild;
                }else{
                    Pop(S, p);
                    Visit(p);
                    r = p;
                    p = NULL;
                }    // else2
            }    // else1
        }    // while
    }
    

    4.层序遍历

    • 伪代码(非递归,使用队列)
    void LevelOrder(BiTree T)
    {
        Queue Q;
        InitQueue(Q);
    
        BiTree p;
        if(T != NULL){
            EnQueue(Q, T);
            while(!isEmpty(Q)){
                p = DeQueue(Q);
                Visit(p);
                if(p->lchild) EnQueue(Q, p->lchild);
                if(p->rchild) EnQueue(Q, p->rchild);
            }    // while
        }    // if
    }
    

    相关文章

      网友评论

          本文标题:数据结构笔记-树

          本文链接:https://www.haomeiwen.com/subject/aqgrcqtx.html