二叉树非递归算法集合

1。各种遍历

1)中序

void InOrder(BiTree T){
    // 创建栈
    BiTree s[maxsize];
    int top = -1;           // 初始化

    BiTree p = T;

    while(p || top != -1){          // 栈不空
        if(p) {                     // 根节点进栈,遍历左子树
            s[++top] = p;
            p = p->lchild;
        }
        else {
            p = s[top--];
            visit(p);
            p = p->rchild;
        }
    }
}

2)先序

const int maxsize = 100;
typedef struct BiNode{
    struct BiNode * lchild, rchild;
    int data;
}BiNode, *BiTree;
// 这个由层序修改而来
void PreOrder(BiTree T){
    if(T == NULL) return;
    // 创建栈
    BiTree s[maxsize];
    int top = -1;           // 初始化
    s[++top] = T;           // 根节点进栈

    while(top != -1){       // 栈不空
        BiTree p = s[top--];
        visit(p);
        if(p->lchild != NULL)
            s[++top] = p->lchild;
        if(p->cchild != NULL)
            s[++top] = p->rchild;
    }
}

// 下面一个是由中序修改得来
void PreOrder(BiTree T){
    // 创建栈
    int s[maxsize] = {0};
    int top = -1;           // 初始化
    BiTree p = T;

    while(p || top != -1){          // 栈不空
        if(p) {                     // 根节点进栈,遍历左子树
            visit(p);
            s[++top] = p;
            p = p->lchild;
        }
        else {
            p = s[top--];
            p = p->rchild;
        }
    }
}

3)后序

const int maxsize = 100;

typedef struct{
    BiNode *p;
    int visited;    // 1表示右节点被访问过
}SNode;             // 元素结构

typedef struct {    // 栈结构
    SNode elem[maxsize];
    int top;
}s;

void PostOrder(BiTree T) {
    SNode sn;
    s.top = -1;
    BiNode *p = T;

    while(T) {              // 一路向左下走
        s.elem[++s.top].p = p;
        s.elem[s.top].visited = 0;
        p = p->lchild;
    }
    while(s.top != -1) {
        sn = s.elem[s.top];     // 访问栈顶
        if(sn.p->rchild != NULL || sn.visited) {
            s.top--;
            visit(sn.p);
        }
        else {
            sn.visited = 1;
            p = sn.p->rchild;
            while(p != NULL) {
                s.elem[++s.top].p = p;
                p = p->lchild;
            }
        }
    }
}

4)层序

const int maxsize = 100;

void level(BiTree T) {
    BiTree q[maxsize];
    int front, rear;
    front = rear = -1;
    q[++rear] = T;

    while(front < rear) {
        BiTree p = q[++front];
        visit(p);
        if(p->lchild != NULL)
            q[++rear] = p->lchild;
        if(p->rchild != NULL)
            q[++rear] = p->rchild;
    }
}

猜你喜欢

转载自blog.csdn.net/fried123123/article/details/81571135