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