二叉树树形输出以及一些简单的计算
大体思路采用到vector容器,使用它可以轻松的进行内容转置(行竖向输出)。采用中序排序的方法(这样子才能保证双亲在左、右孩子之间),对节点竖向的位置进行横向保存到vector容器中,这样就能保证每一行只有一个节点,不用考虑多个节点如何输出等麻烦问题。根据节点所在层数确定节点前面的空格数,根据二叉树的深度确定字符串长度(在字符串后补空格)。最后把保存在容器中的字符串转置输出(横向向转竖向)输出二叉
·
大体思路
采用到vector容器,使用它可以轻松的进行内容转置(行竖向输出)。
采用中序排序的方法(这样子才能保证双亲在左、右孩子之间),对节点竖向的位置进行横向保存到vector容器中,这样就能保证每一行只有一个节点,不用考虑多个节点如何输出等麻烦问题。根据节点所在层数确定节点前面的空格数,根据二叉树的深度确定字符串长度(在字符串后补空格)。最后把保存在容器中的字符串转置输出(横向向转竖向)输出二叉树。
下面代码只给出了计算深度(控制字符串长度需要用到),转置,输出二叉树的代码。
//计算高度
int Depth(BiTree t) {
if (t == nullptr) return 0;
else {
int m = Depth(t->lchild);
int n = Depth(t->rchild);
if (m > n) return (m + 1);
else return (n + 1);
}
}
//对二叉树进行转置
void GetConvertedBTree(BiTree node, int &depth,
int layer,vector<string> &outputBTree){
int i;
if(node==nullptr) return;
GetConvertedBTree(node->lchild,depth,layer+1,outputBTree);
string row;
for(i=0;i<2*layer-1;i++){
row.append(" "); //通过节点所在层数确定前面的空格数,
}
if(layer>0){
row.append("|"); //在每个节点之前添加|
}
row.append(1,node->data);//往row后添加一个字符
row.resize(2*depth+1, ' '); //通过深度确定后面的空格数
outputBTree.push_back(row); //向量尾部添加元素row
GetConvertedBTree(node->rchild,depth,layer+1,outputBTree);
}
//输出,遍历序列输出二叉树
void PrintBTree(BiTree node){
int depth = Depth(node) -1;
if(depth == 0){
cout<<"这是一个空的二叉树!"<<endl;
}else{
vector<string> outputBTree;
GetConvertedBTree(node,depth,0,outputBTree);
//调整方向后树形格式的二叉树
cout<<"二叉树树形是:"<<endl;
for(int column = 0; column < depth*2+1; ++column){
for(auto & it : outputBTree)
cout<<it[column];
cout<<endl;
}
}
}
更多推荐
已为社区贡献1条内容
所有评论(0)