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

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

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;
}


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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值