您的位置:首页 > 其它

树的打印方式

2016-01-24 17:38 274 查看
///////////////////////////////////////////////////////////////////////////////////////////////////////
Z行打印二叉树
5
/ \
1   8
/\   /\
0  2  7 9
\
4
输出格式为 :
5
8 1
0 2 7 9
4
void Z_Print_Tree(Tree *root)
{
if(root == NULL)
{
return ;
}
stack<Tree*> sta[2];   //两个栈   sta[0]是放 奇数层的 数字   sta[1]  放偶数层的数字
sta[0].push(root);
int ceng = 1;//当前打印的层数
while(!sta[0].empty() || !sta[1].empty())
{
Tree *temp = NULL;
if(ceng % 2 != 0)        //奇数层
{
temp = sta[0].top();    //弹出一个元素
sta[0].pop();
cout<<temp->nValue<<" ";
if(temp->pLeft != NULL)
{
sta[1].push(temp->pLeft);   //下一层  为 偶数层  要放到  第二个栈  中
}
if(temp->pRight != NULL)
{
sta[1].push(temp->pRight);    //下一层  为 偶数层  要放到  第二个栈  中
}
}
else
{
temp = sta[1].top();
sta[1].pop();
cout<<temp->nValue<<" ";
if(temp->pRight != NULL)
{
sta[0].push(temp->pRight);
}
if(temp->pLeft != NULL)
{
sta[0].push(temp->pLeft);
}
}
if(ceng % 2 != 0)     //只有  当前的  层数  打印完  层数  ceng  才会 ++
{
if(sta[0].empty())   //奇数层  看  sta[0]  栈  是否  打印完   ,栈 为 空 才会  ceng++
{
cout<<endl;
ceng++;
}
}
if(ceng % 2 == 0)
{
if(sta[1].empty())
{
cout<<endl;
ceng++;
}
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
把二叉树打印成多行
5
/ \
1   8
/\   /\
0  2  7 9
\
4
输出格式为 :
5
1 8
0 2 7 9
4
void Ceng_Print(Tree *root)
{
int Next_Node_Sum = 0;//下一层结点的个数
int To_Be_Print_Sum = 1;//当前层需要打印结点的个数
queue<Tree*> que;
que.push(root);
while(!que.empty())
{
Tree *temp = que.front();
que.pop();
cout<<temp->nValue<<" ";
To_Be_Print_Sum--;
if(temp->pLeft != NULL)
{
que.push(temp->pLeft);
Next_Node_Sum++;
}
if(temp->pRight != NULL)
{
que.push(temp->pRight);
Next_Node_Sum++;
}
if(To_Be_Print_Sum == 0)
{
cout<<endl;
To_Be_Print_Sum = Next_Node_Sum;
Next_Node_Sum = 0;
}
}
}

/////////////////////////////////////////////////////////////////////////////////////////////////////
打印树的第k层结点
//打印第k层结点顺序的打印
5
/ \
1   8
/\   /\
0  2  7 9
\
4
输出格式为 :
第0层 5
第2层 0 2 7 9
void PrintKCeng(Tree *root,int k)
{
if(root == NULL)
{
return;
}
if(k == 0)
{
cout<<root->nValue<<" ";
return;
}
if(root->pLeft != NULL)
{
PrintKCeng(root->pLeft,k-1);
}
if(root->pRight != NULL)
{
PrintKCeng(root->pRight,k-1);
}
}

/////////////////////////////////////////////////////////////////////////////////////////////////////

5
/ \
1   8
/\   /\
0  2  7 9
\
4
输出格式为 :
4
9 7 2 0
8 1
5

void ReversePrintCeng(Tree *root,stack<vector<int> > &sta/*因为当前需要从树的叶子节点输出,所以用栈*/)
{
if(root == NULL)
{
return ;
}
vector<int>vec;    //储层当前层数的节点
queue<Tree*> que;   //通过层遍历 树的 队列
que.push(root);
int To_Be_Print = 1;  //当前层需要打印 的 个数
int Next_Ceng_Sum = 0;  //下一层 需要 打印 的 个数
while(!que.empty()) // 栈不为空
{
Tree *temp = que.front();
que.pop();
vec.push_back(temp->nValue);
To_Be_Print--;       // 需要打印的 个数 --
if(temp->pRight != NULL)  //因为 当前  需要  从 每一层 的 右边 开始 存入节点
{
que.push(temp->pRight);   // 所以 需要  先判断 右边  是否 有节点
Next_Ceng_Sum++;          // 下一层数  的 结点 个数 ++
}
if(temp->pLeft != NULL)
{
que.push(temp->pLeft);
Next_Ceng_Sum++;
}
if(To_Be_Print == 0)        //如果 当前层数 需要打印的 结点  个数 没有 了 0 个
{
sta.push(vec);            // 将当前  层数 的节点   放到  栈中
To_Be_Print = Next_Ceng_Sum;       //更改  需要打印结点的 个数
Next_Ceng_Sum = 0;     //重新 置 0
vec.clear();     //vector  清空
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: