数据结构笔记-树

树 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
}

你可能感兴趣的:(数据结构笔记-树)