首页 > 其他 > 详细

数据结构 -- 二叉树中序遍历

时间:2014-02-28 16:21:27      阅读:518      评论:0      收藏:0      [点我收藏+]

二叉树 中序遍历 的两种方法:

1.递归遍历

2.利用链栈  实现非递归遍历

以下代码在vs2010 测试通过:

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"

typedef struct TreeNode{
	int data;
	struct TreeNode *lchild;
	struct TreeNode *rchild;
}TreeNodePro;
typedef struct StackNode{
	TreeNodePro *stacktree;
	struct StackNode *next;
}StackNodePro;
typedef struct StackList{
	StackNodePro *top;
	int count;
}StackListPro;

//递归 新建二叉树
void create_midorder_tree(TreeNodePro **tree){
	//TreeNodePro *ptree;
	int em;
	int result = 0;

	printf("请输入二叉树的节点的数值:");
	result = scanf("%d",&em);
	if(result != 0 ){
		if( em != 0){

			//ptree = *tree;
			*tree = (TreeNodePro *)malloc(sizeof(TreeNodePro));
			if(*tree != NULL){
				(*tree)->data = em ;
				create_midorder_tree((&(*tree)->lchild));
				create_midorder_tree(&((*tree)->rchild));
			}
		}else{
			*tree = NULL;
		}
	}
}

//递归遍历二叉树
void recursive_midorder_tree(TreeNodePro *tree){
	if(tree != NULL){
		recursive_midorder_tree(tree->lchild);
		printf("%d\t",tree->data);
		recursive_midorder_tree(tree->rchild);
	}
}
//新建栈
void stack_init(StackListPro **stack){
	*stack = (StackListPro *)malloc(sizeof(StackListPro));
	if(*stack != NULL){
		(*stack)->top = NULL;
		(*stack)->count = 0 ;
	}
}
//入栈
void stack_push(StackListPro *s,TreeNodePro *tree){
	StackNodePro *snode;
	snode = (StackNodePro *)malloc(sizeof(StackNodePro));
	if(snode != NULL){
		//StackNodePro *tmp_snode;
		snode->stacktree = tree;
		//tmp_snode = s->top;
		snode->next = s->top ;

		s->top = snode;
		s->count++;
	}
}
//出栈
TreeNodePro* stack_pop(StackListPro *stack){
	if(stack != NULL && stack->count > 0 ){
		StackNodePro *slnode ;
		TreeNodePro *stree;

		stree = stack->top->stacktree;
		slnode = stack->top;
		stack->top = stack->top->next;
		stack->count--;
		free(slnode);
		return stree;
	}
}
//非递归(利用链栈)遍历二叉树
void unrecursive_midorder_tree(TreeNodePro *tree){
	StackListPro *lstack;
	//建栈
	stack_init(&lstack);
	TreeNodePro *ptree;
	ptree = tree;
	while(ptree != NULL || lstack->count > 0){
		while(ptree != NULL){
			stack_push(lstack,ptree);	
			ptree = ptree->lchild;
		}
		ptree = stack_pop(lstack);
		printf("%d\t",ptree->data);
		ptree = ptree->rchild;
	}
}

int _tmain(int argc, _TCHAR* argv[]){
	//中序递归创建 二叉树
	TreeNodePro *tree ;
	create_midorder_tree(&tree);
	//二叉树中序 递归遍历
	printf("递归中序遍历二叉树的结果为:\n");
	recursive_midorder_tree(tree);
	//二叉树中序 非递归遍历
	printf("\n非递归中序遍历二叉树的结果为:\n");
	unrecursive_midorder_tree(tree);
	printf("\n");
	system("pause");
	return 0;
}


输入测试数据,运行结果:

bubuko.com,布布扣


数据结构 -- 二叉树中序遍历,布布扣,bubuko.com

数据结构 -- 二叉树中序遍历

原文:http://blog.csdn.net/lofter_h/article/details/20067897

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!