二叉树 先序遍历 的两种方法:
1.递归遍历
2.利用链栈 实现非递归遍历
以下代码在vs2010 测试通过:
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#define TRUE 1
#define FALSE 0
typedef struct TreeNode{
int data;
struct TreeNode *lchild,*rchild;
}TNode;
typedef struct StackNode{
TNode *tree;
struct StackNode *next;
}StackNodePro;
typedef struct StackList{
StackNodePro* top;
int count;
}StackListPro;
//前序创建 一个二叉树(递归)
int create_preorder_tree(TNode** Tree){
int em;
printf("请输入节点的值:");
scanf("%d",&em);
if(em == 0){
*Tree = NULL;
return TRUE;
}else{
*Tree =(TNode *)malloc(sizeof(TNode));
if(*Tree == NULL){
return FALSE;
}
(*Tree)->data = em;
create_preorder_tree(&((*Tree)->lchild));
create_preorder_tree(&((*Tree)->rchild));
}
return TRUE;
}
//前序遍历整个二叉树 (递归)
void preorder_tree_recursive(TNode *Tree){
if(Tree != NULL){
printf("%d\t",Tree->data);
preorder_tree_recursive(Tree->lchild);
preorder_tree_recursive(Tree->rchild);
}
}
//建栈
void stack_init(StackListPro *s){
s->top = NULL;
s->count = 0 ;
}
//入栈
void stack_push(StackListPro* s,TNode *tree){
StackNodePro *snode ;
snode = (StackNodePro *)malloc(sizeof(StackNodePro));
if(snode != NULL){
snode->tree = tree ;
snode->next = s->top;
s->top = snode;
s->count++;
}
}
//出栈
TNode* stack_pop(StackListPro* s){
if(s != NULL && s->count > 0){
StackNodePro *pop_node;
TNode *pop_tree_node ;
pop_node = s->top;
pop_tree_node = s->top->tree;
s->top = s->top->next;
s->count--;
free(pop_node);
return pop_tree_node;
}
}
int stack_is_empty(StackListPro *s){
if(s->top == NULL || s->count == 0){
return 0;
}
return 1;
}
//前序遍历整个二叉树 (非递归)
void preorder_tree_unrecursive(TNode *Tree){
TNode *pop_tree;
pop_tree = Tree;
StackListPro stack;
stack_init(&stack);
while(pop_tree != NULL || stack_is_empty(&stack) != NULL){
while(pop_tree != NULL){
printf("%d\t",pop_tree->data);
stack_push(&stack,pop_tree);
pop_tree = pop_tree->lchild;
}
pop_tree = stack_pop(&stack);
pop_tree = pop_tree->rchild;
}
}
int _tmain(int argc, _TCHAR* argv[]){
TNode* Tree = NULL;
create_preorder_tree(&Tree);
printf("\n递归法 前序遍历二叉树:\n");
preorder_tree_recursive(Tree);
printf("\n非递归法 前序遍历二叉树:\n");
preorder_tree_unrecursive(Tree);
printf("\n");
system("pause");
return TRUE;
}运行结果:
数据结构 -- 二叉树 -- 先序遍历,布布扣,bubuko.com
原文:http://blog.csdn.net/lofter_h/article/details/19992261