大体思路

采用到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;
        }
    }
}
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐