#include "stdafx.h" #include "stdio.h" #include "stdlib.h" typedef struct _item { struct _item* left; struct _item* right; int data; }item,*pitem; typedef enum _type { L, R }type; typedef struct _stack{ pitem node; struct _stack * link; type tag; }stack,*pstack; #define MAX_NODE 20 pitem create(int * a, int n) { int i,parent; pitem node[MAX_NODE]; pitem root; for (i = 0; i < n; i++) { node[i] = (pitem)malloc(sizeof (item)); node[i]->data = a[i]; node[i]->left = node[i]->right = NULL; } for (i = 0; i < n; i++) { if (i == 0) { root = node[i]; continue; } if (i%2) { parent = i/2; node[parent]->left = node[i]; } else { parent = i/2 -1; node[parent]->right = node[i]; } } return root; } void traversal_mid(pitem root) { pstack ps,top; pitem node = root; ps = top = NULL; while (top != NULL || node != NULL) { while(node != NULL) { ps = (pstack)malloc(sizeof (stack)); ps->node = node; ps->link = top; top = ps; node = node->left; } if (top != NULL) { ps = top; node = ps->node; top = top->link; free(ps); printf("%d ",node->data); node = node->right; } } printf("/n"); } void traversal_first(pitem root) { pstack ps,top; pitem node = root; ps = top = NULL; while (top != NULL || node != NULL) { while(node != NULL) { ps = (pstack)malloc(sizeof (stack)); ps->node = node; ps->link = top; top = ps; printf("%d ",node->data); node = node->left; } if (top != NULL) { ps = top; node = ps->node; top = top->link; free(ps); node = node->right; } } printf("/n"); } void traversal_last(pitem root) { pstack ps,pt,top; pitem node = root; ps = pt = top = NULL; do { while(node != NULL) { ps = (pstack)malloc(sizeof (stack)); ps->node = node; ps->link = top; ps->tag = L; top = ps; node = node->left; } while(top != NULL && top->tag == R) { ps = top; node = ps->node; top = top->link; printf("%d ",node->data); free(ps); } if (top != NULL) { top->tag = R; node = top->node; node = node->right; } }while(top != NULL); printf("/n"); } pitem _create_rec(int *a, int i, int n) { pitem node = NULL; if (i < n) { node = (pitem)malloc(sizeof(item)); node->data = a[i]; node->left = _create_rec(a, i * 2 + 1, n); node->right = _create_rec(a, i * 2 + 2, n); } return node; } pitem create_rec(int *a,int n) { return _create_rec(a,0,n); } void traversal_mid_rec(pitem root) { if (root != NULL) { traversal_mid_rec(root->left); printf("%d ",root->data); traversal_mid_rec(root->right); } } void traversal_first_rec(pitem root) { if (root != NULL) { printf("%d ",root->data); traversal_first_rec(root->left); traversal_first_rec(root->right); } } void traversal_last_rec(pitem root) { if (root != NULL) { traversal_last_rec(root->left); traversal_last_rec(root->right); printf("%d ",root->data); } } int _tmain(int argc, _TCHAR* argv[]) { int a[10] = {1,2,3,4,5,6,7,8,9,10}; pitem root; root = create(a,10); traversal_mid(root); traversal_first(root); traversal_last(root); root = create_rec(a,10); traversal_mid_rec(root); printf("/n"); traversal_first_rec(root); printf("/n"); traversal_last_rec(root); printf("/n"); getchar(); return 0; }