采用到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&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<<"这是一个空的二叉树!"< outputBTree; GetConvertedBTree(node,depth,0,outputBTree); //调整方向后树形格式的二叉树 cout<<"二叉树树形是:"< 欢迎分享,转载请注明来源:内存溢出
评论列表(0条)