递归构建二叉树---中序遍历二叉树(递归与非递归)

#include <stdio.h>
#include <stdlib.h> 

#define A 16

//二叉树前序遍历序列------参考输入
int buffer[16]={10,6,4,-1,-1,8,-1,-1,14,12,-1,-1,16,-1,-1,-100};

//二叉树结构体
typedef struct binary_tree_node
{
	int data;
	struct binary_tree_node* ltree;
	struct binary_tree_node* rtree;
}Btnode;

//创建新节点
Btnode* create_node(void)
{
	Btnode* node;
	node=(Btnode*)malloc(sizeof(Btnode));
	return node;
}

//据输入的前序序列递归创建二叉树
void create_tree(Btnode* &pnode)
{
	int num;

	scanf("%d",&num);
	if(num!=-1)
	{
		pnode=create_node();
		pnode->data=num;
		create_tree(pnode->ltree);
		create_tree(pnode->rtree);
	}
	else
	{
		pnode=NULL;
		return;
	}
	return;
}

//递归方法中序遍历
void inorder_traversal(Btnode* pnode)
{
	if(pnode!=NULL)
	{
		inorder_traversal(pnode->ltree);
		printf("%d ",pnode->data);
		inorder_traversal(pnode->rtree);
	}
	else
	{
		return;
	}
	return;
}

//非递归方法中序遍历
void inorder_traversal1(Btnode* root)
{
	Btnode* s[A];
	Btnode* pnode;
	int m=0;
	bool ltree=true;

	pnode=root;
	s[m++]=pnode;

	while(pnode!=NULL)
	{
		if(ltree==true)
		{
			if(pnode->ltree!=NULL)
			{
				pnode=pnode->ltree;
				s[m++]=pnode;
			}
			else
			{
				ltree=false;
				pnode=s[--m];
				printf("%d ",pnode->data);
			}
		}
		else
		{
			if(pnode->rtree!=NULL)
			{
				printf("%d ",pnode->data);
				pnode=pnode->rtree;
				s[m++]=pnode;
				ltree=true;
			}
			else
			{
				pnode=s[--m];
			}
		}
		if(m==-1)
		{
			break;
		}
	}
}

int main(void)
{
	Btnode* root;
	printf("请输入构建二叉树所需的前序序列,其中-1代表空节点:\n\n");
	create_tree(root);
	printf("\n\n");

	printf("Recursive inorder traversal result is:\n");
	inorder_traversal(root);
	printf("\n\n");
	printf("Non-Recursive inorder traversal result is:\n");
	inorder_traversal1(root);
	printf("\n\n");

	system("pause");
	return 0;
}
递归构建二叉树---中序遍历二叉树(递归与非递归)_第1张图片

你可能感兴趣的:(递归,非递归,中序遍历,递归构建二叉树)