二叉树的打印分为两种,横向打印和纵向打印。
1 横向打印算法
void show(TreeNode *parent,TreeNode* root,string &prefix){
prefix += "|";
if (root){
cout << prefix<<"--" << root->val << endl;
if (root==parent||root == parent->right){
prefix.pop_back(); prefix += " ";
}
show(root,root->left, prefix+" ");
show(root,root->right, prefix+" ");
}else{
if (parent->left || parent->right) //有一个孩子节点不空就打印,以区分左右孩子
cout << prefix << "--" << "{}"<< endl;
}
}
2 纵向打印算法
主要使用二叉树的层序遍历,过程中按照中序序列确定每个节点列的位置
void Tree::disp(){
queue<TreeNode *> q;
q.push(this->root);
string InOrd;
this->InOrder(this->root,InOrd);//获得中序遍历序列
while (!q.empty()){
vector<TreeNode*> cache;
//把处在同一行的节点拉出来
while (!q.empty()){ cache.push_back(q.front()); q.pop(); }
string line = " ";
for (auto p:cache)
if (p){
//找当前节点中序遍历位置
line[InOrd.find(p->val)] = p->val;
//孩子节点入队
if (p->left) q.push(p->left);
if (p->right) q.push(p->right);
}
cout << line << endl;
}
}
//==================中序遍历===========================
void Tree::InOrder(TreeNode* root,string &In){
if (root){
InOrder(root->left, In);
In += root->val;
InOrder(root->right, In);
}
}
效果如图: