Print a binary tree in a pretty way

后端 未结 15 1170
我寻月下人不归
我寻月下人不归 2020-11-28 22:15

Just wondering if I can get some tips on printing a pretty binary tree in the form of:

5
     10
          11
          7
               6
     3
          4         


        
相关标签:
15条回答
  • 2020-11-28 22:37

    Here is preorder routine that prints a general tree graph in a compact way:

            void preOrder(Node* nd, bool newLine=false,int indent=0)
            {
                    if(nd != NULL) {    
                            if (newLine && indent) {
                                    std::cout << "\n" << std::setw(indent) << ' '
                            }  else if(newLine)
                                    std::cout << "\n";
                            cout<< nd->_c;
                            vector<Node *> &edges=nd->getEdges();
                            int eSize=edges.size();
                            bool nwLine=false;
                            for(int i=0; i<eSize; i++) {
                                    preOrder(edges[i],nwLine,indent+1);
                                    nwLine=true;
                            }
                    }
            }
    
    int printGraph()
    {
         preOrder(root,true);
    }
    
    0 讨论(0)
  • 2020-11-28 22:38

    From your root, count the number of your left children. From the total number of left children, proceed with printing the root with the indention of the number of left children. Move to the next level of the tree with the decremented number of indention for the left child, followed by an initial two indentions for the right child. Decrement the indention of the left child based on its level and its parent with a double indention for its right sibling.

    0 讨论(0)
  • 2020-11-28 22:39

    In order to pretty-print a tree recursively, you need to pass two arguments to your printing function:

    • The tree node to be printed, and
    • The indentation level

    For example, you can do this:

    void BinarySearchTree::postorder(tree_node* p, int indent=0)
    {
        if(p != NULL) {
            if(p->left) postorder(p->left, indent+4);
            if(p->right) postorder(p->right, indent+4);
            if (indent) {
                std::cout << std::setw(indent) << ' ';
            }
            cout<< p->data << "\n ";
        }
    }
    

    The initial call should be postorder(root);

    If you would like to print the tree with the root at the top, move cout to the top of the if.

    0 讨论(0)
  • 2020-11-28 22:39

    For an Array I find this much more concise. Merely pass in the array. Could be improved to handle very large numbers(long digit lengths). Copy and paste for c++ :)

    #include <math.h>
    using namespace std;   
    void printSpace(int count){
        for (int x = 0; x<count; x++) {
            cout<<"-";
        }
    }
    void printHeap(int heap[], int size){
        cout<<endl;
        int height = ceil(log(size)+1); //+1 handle the last leaves
        int width = pow(2, height)*height;
        int index = 0;
        for (int x = 0; x <= height; x++) { //for each level of the tree
            for (int z = 0; z < pow(2, x); z++) { // for each node on that tree level
                int digitWidth = 1;
                if(heap[index] != 0) digitWidth = floor(log10(abs(heap[index]))) + 1;
                printSpace(width/(pow(2,x))-digitWidth);
                if(index<size)cout<<heap[index++];
                else cout<<"-";
                printSpace(width/(pow(2,x)));
            }
            cout<<endl;
        }
    }
    
    0 讨论(0)
  • 2020-11-28 22:40
    void btree::postorder(node* p, int indent)
    {
        if(p != NULL) {
            if(p->right) {
                postorder(p->right, indent+4);
            }
            if (indent) {
                std::cout << std::setw(indent) << ' ';
            }
            if (p->right) std::cout<<" /\n" << std::setw(indent) << ' ';
            std::cout<< p->key_value << "\n ";
            if(p->left) {
                std::cout << std::setw(indent) << ' ' <<" \\\n";
                postorder(p->left, indent+4);
            }
        }
    }
    

    With this tree:

    btree *mytree = new btree();
    mytree->insert(2);
    mytree->insert(1);
    mytree->insert(3);
    mytree->insert(7);
    mytree->insert(10);
    mytree->insert(2);
    mytree->insert(5);
    mytree->insert(8);
    mytree->insert(6);
    mytree->insert(4);
    mytree->postorder(mytree->root);
    

    Would lead to this result:

    enter image description here

    0 讨论(0)
  • 2020-11-28 22:40
    #include <stdio.h>
    #include <stdlib.h>
    
    struct Node
    {
        struct Node *left,*right;
        int val;
    } *root=NULL;
    
    int rec[1000006];
    void addNode(int,struct Node*);
    void printTree(struct Node* curr,int depth)
    {
        int i;
        if(curr==NULL)return;
        printf("\t");
        for(i=0;i<depth;i++)
            if(i==depth-1)
                printf("%s\u2014\u2014\u2014",rec[depth-1]?"\u0371":"\u221F");
            else
                printf("%s   ",rec[i]?"\u23B8":"  ");
        printf("%d\n",curr->val);
        rec[depth]=1;
        printTree(curr->left,depth+1);
        rec[depth]=0;
        printTree(curr->right,depth+1);
    }
    int main()
    {
        root=(struct Node*)malloc(sizeof(struct Node));
        root->val=50;
        //addNode(50,root);
        addNode(75,root);    addNode(25,root);
        addNode(15,root);    addNode(30,root);
        addNode(100,root);    addNode(60,root);
        addNode(27,root);    addNode(31,root);
        addNode(101,root);    addNode(99,root);
        addNode(5,root);    addNode(61,root);
        addNode(55,root);    addNode(20,root);
        addNode(0,root);    addNode(21,root);
        //deleteNode(5,root);
    
        printTree(root,0);
        return 0;
    }
    
    void addNode(int v,struct Node* traveller)
    {
        struct Node *newEle=(struct Node*)malloc(sizeof(struct Node));
        newEle->val=v;
        for(;;)
        {
            if(v<traveller->val)
            {
                if(traveller->left==NULL){traveller->left=newEle;return;}
                traveller=traveller->left;
            }
            else if(v>traveller->val)
            {
                if(traveller->right==NULL){traveller->right=newEle;return;}
                traveller=traveller->right;
            }
            else
            {
                printf("%d Input Value is already present in the Tree !!!\n",v);
                return;
            }
        }
    }
    

    Hope, you find it pretty...

    Output:

    50
    ͱ———25
    ⎸   ͱ———15
    ⎸   ⎸   ͱ———5
    ⎸   ⎸   ⎸   ͱ———0
    ⎸   ⎸   ∟———20
    ⎸   ⎸        ∟———21
    ⎸   ∟———30
    ⎸        ͱ———27
    ⎸        ∟———31
    ∟———75
         ͱ———60
         ⎸   ͱ———55
         ⎸   ∟———61
         ∟———100
              ͱ———99
              ∟———101
    
    0 讨论(0)
提交回复
热议问题