打印二叉树

二叉树的打印分为两种,横向打印和纵向打印。
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);
    }
}

效果如图:
这里写图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章