参考着别人的写一些遍历的方式,其中后序只用一个栈的遍历还不能理解,先总结到一起去吧。 #include <stdio.h> #include <stdlib.h> #include<memory.h> #define MAX 100 //最多一百个节点 typedef struct btnode { char value; struct btnode *left; struct btnode *right; } btnode; btnode *create() { char ch; scanf("%c", &ch); if(ch=='#') return NULL; else { btnode *t = malloc(sizeof(btnode)); t->value = ch; t->left = create(); t->right = create(); return t; } } void preorder_recursive(btnode *root) { if(root != NULL) { printf("%c", root->value); preorder_recursive(root->left); preorder_recursive(root->right); } } void inorder_recursive(btnode *root) { if(root != NULL) { inorder_recursive(root->left); printf("%c", root->value); inorder_recursive(root->right); } } void postorder_recursive(btnode *root) { if(root != NULL) { postorder_recursive(root->left); postorder_recursive(root->right); printf("%c", root->value); } } void nonrecursive_preorder(btnode *root) { if(root) { btnode *stack[MAX], *t = root; int top = -1; stack[++top] = t; while(top > -1) //栈非空 { t = stack[top--]; printf("%c", t->value); if(t->right) stack[++top] = t->right; if(t->left) stack[++top] = t->left; } } } void nonrecursive_inorder(btnode *root) { if(root) { btnode *stack[MAX], *t = root; int top = -1; while(t || top>-1) //当前节点不为空或者栈中还有元素 { while(t)//当前节点入栈,然后一直往左走,一直到最左的节点为止 { stack[++top] = t; t = t->left; } if(top > -1) { t = stack[top--]; printf("%c", t->value); t = t->right;//出栈的节点一定是最左的节点,所以它不可能有左子树,只能往右边走 } } } } void nonrecursive_postorder(btnode *root) { if(root) { btnode *stack[MAX]; int top = -1; stack[++top] = root; btnode *pre = NULL; while(top > -1) { btnode *cur = stack[top];//cur指向栈顶 if(!pre || pre->left==cur || pre->right==cur) { if(cur->left) stack[++top] = cur->left; else if(cur->right) stack[++top] = cur->right; } else if(cur->left==pre) { if(cur->right) stack[++top] = cur->right; } else { printf("%c", cur->value); top--; } pre = cur; } } } /* 使用两个栈 s1按这样的顺序存放:根、右、左 每从s1弹出一个元素就放进s2,其实就是左、右、根,后序遍历的结果就是这样的 */ void nonrecursive_postorder_two_stacks(btnode *root) { if(root) { btnode *s1[MAX], *s2[MAX], *t = root; int top1 = -1, top2 = -1; s1[++top1] = t; while(top1>-1) { t = s1[top1--]; s2[++top2] = t; if(t->left) s1[++top1] = t->left; if(t->right) s1[++top1] = t->right; } while(top2>-1) printf("%c", s2[top2--]->value); } } void levelorder(btnode *root) { btnode *queue[MAX]; memset(queue, 0, sizeof(queue));//这里要做初始化,因循环退出的条件是t为NULL,不初始化t可能乱指一个地方 int size = 0; int qptr = 0; btnode *t = root; while(t) { printf("%c", t->value); if(t->left) queue[size++] = t->left; if(t->right) queue[size++] = t->right; t = queue[qptr++]; } } int main() { btnode *root = create(); printf("Recursive:/n"); preorder_recursive(root); printf("/n"); inorder_recursive(root); printf("/n"); postorder_recursive(root); printf("/n"); printf("Nonrecursive:/n"); nonrecursive_preorder(root); printf("/n"); nonrecursive_inorder(root); printf("/n"); nonrecursive_postorder(root); printf("/n"); nonrecursive_postorder_two_stacks(root); printf("/n"); levelorder(root); printf("/n"); return 0; }