完全二叉树的三种遍历(二)--- 顺序存储

上篇文章中已经贴了二叉树三种遍历的递归及非递归的实现代码,那这篇文章是干什么的呢?嗯,虽然不论是二叉树的顺序存储还是二叉树的链式存储,三种遍历的思路都是一样的,但是在写代码的时候仍然还要注意边界,所以决定也贴出来吧,好查找呗^O^

来,继续上篇文章的树,二叉树的顺序存储就是在数组中存储。在代码上看起来就是一个数组,我们之所以说它是二叉树,意味着,在这篇文章中,逻辑意义上我们将它看成一颗树!!你会注意到上篇文章的树不是一个完全二叉树,所以在数组中存储起来很浪费空间,所以本篇说的都是完全二叉树的顺序存储哦!

如下:有一个完全二叉树:


一颗树,我们将它按层从上往下,每层从左往右依次存到数组中去。当然你也可以从数组的1号下标开始存储喔~,我就直接从0号下标开始存储咯!

根结点与左右孩子索引的关系如下!!!


/*********************************************************************/
//先序遍历的递归
void PreTravel1(char *arr,int parentindex,int len)
{
	if(parentindex<=len-1)
	{
		cout<<arr[parentindex]<<" ";
		PreTravel1(arr,parentindex*2+1,len);
		PreTravel1(arr,parentindex*2+2,len);
	}
}

//先序遍历的非递归
void PreTravel2(char* arr,int parentindex,int len)
{
	//1
	//stack<char> st;
	
	//while(1)
	//{
	//	if(st.empty() && parentindex>len-1)
	//		break;
	//	if(parentindex<=len-1 )
	//	{
	//		st.push(parentindex);
	//		cout<<arr[parentindex]<<" ";
	//		parentindex=parentindex*2+1;
	//	}
	//	else
	//	{
	//		parentindex=st.top();
	//		parentindex=parentindex*2+2;
	//		st.pop();
	//	}
	//}
	//1使用队列
	//deque<char> que;
	//que.push_back(parentindex);
	//while(!que.empty())
	//{
	//	parentindex=que.front();que.pop_front();
	//	cout<<arr[parentindex]<<" ";
	//	if(parentindex*2+1<=len)
	//		que.push_back(parentindex*2+2);
	//	if(parentindex*2+2<=len)
	//		que.push_back(parentindex*2+1);
	//}

	//2使用栈
	stack<char> st;
	while(!st.empty() || parentindex<=len-1)
	{
		while(parentindex<=len-1)
		{
			st.push(parentindex);
			cout<<arr[parentindex]<<" ";
			parentindex=parentindex*2+1;
		}
		parentindex=st.top();
		parentindex=parentindex*2+2;
		st.pop();
	}
}
void Pre(char *arr,int len)
{
	if(arr==NULL || len<=0)
		return ;
	PreTravel1(arr,0,len);
	//PreTravel2(arr,0,len);
}
/*********************************************************************/
//中序遍历的递归实现
void InTravel1(char* arr,int parentindex,int len)
{
	if(parentindex<=len-1)
	{
		InTravel1(arr,parentindex*2+1,len);
		cout<<arr[parentindex]<<" ";
		InTravel1(arr,parentindex*2+2,len);
	}
}
//中序遍历的非递归实现
void InTravel2(char* arr,int parentindex,int len)
{
	stack<char> st;
	
	while(!st.empty() || parentindex<=len-1)
	{
		while(parentindex<=len-1)
		{
			st.push(parentindex);
			parentindex=parentindex*2+1;
		}
		parentindex=st.top();
		cout<<arr[parentindex]<<" ";
		st.pop();
		parentindex=parentindex*2+2;
	}
}
void In(char *arr,int len)
{
	if(arr==NULL || len<=0)
		return ;
	InTravel1(arr,0,len);
	//InTravel2(arr,0,len);
}
/*********************************************************************/
//后序遍历的递归实现
void PostTravel1(char *arr,int parentindex,int len)
{
	if(parentindex<=len-1)
	{
		PostTravel1(arr,parentindex*2+1,len);
		PostTravel1(arr,parentindex*2+2,len);
		cout<<arr[parentindex]<<" ";
	}
}
//后序遍历的非递归实现
void PostTravel2(char* arr,int parentindex,int len)
{
	stack<char> st;
	int tag=-1;
	while(!st.empty() || parentindex<=len-1)
	{
		while(parentindex<=len-1)
		{
			st.push(parentindex);
			parentindex=parentindex*2+1;
		}
		parentindex=st.top();st.pop();
		if(parentindex*2+2==tag || parentindex*2+2>len-1)
		{
			cout<<arr[parentindex]<<" ";
			tag=parentindex;
			parentindex=len;
		}
		//parentindex=parentindex*2+2;
		else
		{
			st.push(parentindex);
			parentindex=parentindex*2+2;
		}
	}
}

void Post(char *arr,int len)
{
	if(arr==NULL && len<=0)
		return ;
	PostTravel1(arr,0,len);
	//PostTravel2(arr,0,len);
}
/*********************************************************************/
int main()
{
	char arr[]={'A','B','C','D','E','F','G','H'};
	int len=sizeof(arr)/sizeof(arr[0]);
	
	cout<<"PreTravel: ";
	Pre(arr,len);
	cout<<endl;

	cout<<"InTravel: ";
	In(arr,len);
	cout<<endl;

	cout<<"PostTravel: ";
	Post(arr,len);
	cout<<endl;
	return 0;
}


猜你喜欢

转载自blog.csdn.net/zhuoya_/article/details/80494525