构建二叉树(据前序遍历结果)--- 前序遍历二叉树(递归与非递归)

时间:2021-03-07 11:26:18
#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;
}

//据前序序列创建二叉树
/*
	明确问题:

	(1)何时进行二叉树分支的切换

		①左分支遍历到叶子节点时

		②右分支有新的节点加入时

	(2)何时节点入栈

		新加入的非空节点

	(3)何时节点出栈

		某分支遍历到叶子节点时
*/
Btnode* create_tree(int* buf)
{
	Btnode* root;
	Btnode* pnode,*temp;
	Btnode* s[A];
	bool ltree=true;
	int index=0;
	int m=0;
	
	root=create_node();
	root->data=buf[index++];
	s[m++]=root;
	pnode=root;

	while(buf[index]!=-100)
	{
		if(ltree==true)
		{
			if(buf[index]==-1)
			{
				pnode->ltree=NULL;
				index++;
				ltree=false;
				pnode=s[--m];
			}
			else
			{
				temp=create_node();
				temp->data=buf[index++];
				pnode->ltree=temp;
				s[m++]=temp;
				pnode=temp;
			}
		}
		else
		{
			if(buf[index]==-1)
			{
				pnode->rtree=NULL;
				index++;
				pnode=s[--m];
			}
			else
			{
				temp=create_node();
				temp->data=buf[index++];
				pnode->rtree=temp;
				s[m++]=temp;
				pnode=temp;
				ltree=true;
			}
		}
	}

	return root;
}

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

	preorder_traversal(pnode->ltree);
	preorder_traversal(pnode->rtree);
	return;
}

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

	pnode=root;
	s[m++]=pnode;
	printf("%d ",pnode->data);

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

int main(void)
{
	Btnode* root;
	root=create_tree(buffer);

	printf("Recursive preorder traversal result is:\n");
	preorder_traversal(root);
	printf("\n\n");
	printf("Non-Recursive preorder traversal result is:\n");
	preorder_traversal1(root);
	printf("\n\n");
	system("pause");
	return 0;
}

构建二叉树(据前序遍历结果)--- 前序遍历二叉树(递归与非递归)