Non-recursive binary tree traversal implemented in C ++

#include<iostream>
#include<stdlib.h>
#define maxsize 100

using namespace std;

typedef struct BTNode{
    char val;
    BTNode *lchild, *rchild;
}*BiTNode;

void CreateTree(BTNode *&root){
    char c;
    cin >> c;
    if(c == '#')
        root = NULL;
    else{
        root = (BTNode *) malloc(sizeof(BTNode));
        if(!root){
            cerr << "No More Memory!" << endl;
            exit(-1);
        }
        root->val = c;
        CreateTree(root->lchild);
        CreateTree(root->rchild);
    }
}

void PreOrderRecursion(BTNode *root){
    if(root){
        cout << root->val << " ";
        PreOrderRecursion(root->lchild);
        PreOrderRecursion(root->rchild);
    }
}

void PreOrderNoRecursion(BTNode *root){
    if(!root){
        cout << "Root is NULL!" << endl;
        return;
    }
    BTNode* stack[maxsize];   //模拟一个栈
    int top = -1;             //栈顶指针
    stack[++top] = root;
    while(top != -1){
        BTNode *p = stack[top--];
        cout << p->val << " ";
        if(p->rchild)         //由于左子树先被访问,则右子树应该先入栈
            stack[++top] = p->rchild;
        if(p->lchild)
            stack[++top] = p->lchild;
    }
}

void InOrderRecursion(BTNode *root){
    if(root){
        InOrderRecursion(root->lchild);
        cout << root->val << " ";
        InOrderRecursion(root->rchild);
    }
}

void InOrderNoRecursion(BTNode *root){
    if(!root){
        cout << "Root is NULL!" << endl;
        return;
    }
    BTNode* stack[maxsize];
    int top = -1;
    BTNode *p = root;
    while(top != -1 || p != NULL){
        while(p){
            stack[++top] = p;
            p = p->lchild;
        }
        //从根节点一直往左子树遍历,如果没有左子树
        //打印这个节点,往右节点移动
        p = stack[top--];
        cout << p->val << " ";
        p = p->rchild;
    }
}

void PostOrderRecursion(BTNode *root){
    if(root){
        PostOrderRecursion(root->lchild);
        PostOrderRecursion(root->rchild);
        cout << root->val << " ";
    }
}

void PostOrderNoRecursion(BTNode *root){
    if(!root){
        cout << "Root is NULL!" << endl;
        return;
    }
    BTNode* stack1[maxsize];  int top1 = -1;
    BTNode* stack2[maxsize];  int top2 = -1;
    //首先把根节点如stack1
    stack1[++top1] = root;
    while(top1 != -1){
        BTNode *p = stack1[top1--];
        stack2[++top2] = p;
        if(p->lchild)
            stack1[++top1] = p->lchild;
        if(p->rchild)
            stack1[++top1] = p->rchild;
    }
    //此时倒序输出stack2即为后序遍历的序列
    while(top2 != -1){
        BTNode *p = stack2[top2--];
        cout << p->val << " ";
    }
}

int main(){
    BTNode *root;
    CreateTree(root);
     /**
        test code
      */
    return 0;
}

Guess you like

Origin www.cnblogs.com/dotdashdotdash/p/11863592.html