树的递归和非递归遍历

来源:互联网 发布:php log日志 linux 编辑:程序博客网 时间:2024/05/18 17:25
#include <stdio.h>#include <stdlib.h>#include <iostream>#include <queue>#include <stack>using namespace std;typedef struct BiNode{   struct BiNode* lNode;   struct BiNode* rNode;   int data;}*BiTree;void createTree(BiTree &T){    int data;    scanf("%d", &data);    if (data == 0)    {        T = NULL;        return;    }    T = (BiTree)malloc(sizeof(struct BiNode));    T->lNode = NULL;    T->rNode = NULL;    T->data = data;    createTree(T->lNode);    createTree(T->rNode);}void preOrder(BiTree T){    if (T == NULL)    {        return;    }    printf("%d ", T->data);    preOrder(T->lNode);    preOrder(T->rNode);}void inOrder(BiTree T){    if (T == NULL)    {        return;    }    inOrder(T->lNode);    printf("%d ", T->data);    inOrder(T->rNode);}void postOrder(BiTree T){    if (T == NULL)    {        return;    }    postOrder(T->lNode);    postOrder(T->rNode);    printf("%d ", T->data);}void levelOrder(BiTree T){BiNode* p;queue<BiNode*> Q;Q.push(T);while (!Q.empty()){p = Q.front();Q.pop();printf("%d ", p->data);if (p->lNode)Q.push(p->lNode);if (p->rNode)Q.push(p->rNode);}}/*前序非递归遍历树*/void preOrderTree(BiTree T){stack<BiNode*> S;BiNode* p = T;while (p!=NULL || !S.empty()){while (p != NULL){printf("%d ", p->data);S.push(p);p = p->lNode;}if (!S.empty()){p = S.top();S.pop();p = p->rNode;}}}/*中序非递归遍历树*/void inorderTree(BiTree T){stack<BiNode*> S;BiNode* p = T;while (p!=NULL || !S.empty()){/*左子树全部入栈*/while (p != NULL){S.push(p);p = p->lNode;}if (!S.empty()){p = S.top();S.pop();printf("%d ", p->data);p = p->rNode;}}}/*后序非递归遍历树*/void postOrderTree(BiTree T){stack<BiNode*> S;BiNode* p = T;BiNode* q = NULL;while (p!=NULL || !S.empty()){/*左子树全部入栈*/while (p != NULL){S.push(p);p = p->lNode;}if (!S.empty()){p = S.top();if (p->rNode==NULL || (p->rNode==q)){printf("%d ", p->data);q = p;S.pop();p = NULL; /*这个地方要置为空,否则会死循环*/}elsep = p->rNode;}}}int main(){    #if 1    BiTree T = NULL;    createTree(T);    printf("前序:\n");    preOrder(T);printf("\n非递归前序:\n");preOrderTree(T);    printf("\n中序:\n");    inOrder(T);printf("\n非递归中序\n");inorderTree(T);    printf("\n后序:\n");    postOrder(T);printf("\n非递归后序\n");postOrderTree(T);    printf("\n层序:\n");levelOrder(T);printf("\n");    #endif           return 0;}

0 0