如何打印二叉树?

时间:2018-12-03 16:11:41

标签: c struct tree binary-tree binary-search-tree

我创建了一个基本上具有二叉树的程序,可以在其中删除/插入节点。我也可以计算它的遍历,但是我想以真实形式打印树。我的意思是。 程序现在打印:1 2 3 4

我要打印:

            from bs4 import BeautifulSoup
            import requests
            import time

            from selenium import webdriver
            from selenium.webdriver.common.by import By
            from selenium.webdriver.chrome.options import Options

            driver = webdriver.Chrome('/Users/user/Documents/docs/chromedriver')

            url = driver.get('https://getnada.com')
            element = driver.find_elements(By.CSS_SELECTOR, 'span.address.what_to_copy')

            print(element)

这当然是可行的,但是我的时间很短。请提供解决此问题的方法。 (是的,我知道要求解决方案很多)。 在我的代码中,我注释了以下行,在这些行中调用了打印结果的函数。注释看起来像这样“ //我想将其打印为树” 这些是计算和打印树的行。我只想制作它们,以便它们打印出一棵真正的树。

我的代码:

       1    
     /   \
    2     3  
   /   
  4

1 个答案:

答案 0 :(得分:0)

问题是您需要具有2^maxDepth方形框才能正确绘制节点。

(0,(2^maxDepth)/2)点处绘制根,并且 随后的子节点位于((1,(parent node position)/2), ((parent node positon)/2, 1)位置。

请考虑以下示例代码。

int maxDepth(node* node)  
{ 
   if (node==NULL)  
       return 0; 
   else 
   { 
       /* compute the depth of each subtree */
       int lDepth = maxDepth(node->left); 
       int rDepth = maxDepth(node->right); 

       /* use the larger one */
       if (lDepth > rDepth)  
           return(lDepth+1); 
       else return(rDepth+1); 
   } 
}

void drawTree(node *node)
{
   int maxdepth = maxDepth(node);
   int numSpace = pow(2,maxdepth)+1;
    int i = 0;

    for (i = 0;i < maxdepth;i++)
    {
        printGraph(node, numSpace, 1, i, 0);
        numSpace /=2;

        printf("\n");
     }

}

int printGraph(node *node, int numSpace,int isLeft, int expectedLevel, int currentLevel)
{


   int i = 0;

   if (node == NULL || currentLevel > expectedLevel)
    {
     for (i = 0;i<(numSpace)/2;i++) printf(" ");
     return -1;
    }

   if (expectedLevel == currentLevel)
   {
      for (i = 0;i<(numSpace)/2;i++) printf(" ");
      printf("%d", node->data);

   }
   else
   {

      printGraph(node->left, numSpace, 1, expectedLevel, currentLevel+1);

     for (i = 0;i<(numSpace)/2;i++) printf(" ");

        printGraph(node->right, (numSpace), 0, expectedLevel, currentLevel+1);


     return ret;

   }
}

我从drawTreemain,如下所示。

void main()
{
    node *root;
    node *tmp;
    //int i;

    root = NULL;
    /* Inserting nodes into tree */
    insert(&root, 9);
    insert(&root, 4);
    insert(&root, 15);
    insert(&root, 6);
    insert(&root, 12);
    insert(&root, 17);
    insert(&root, 2);
insert(&root, 0);

insert(&root, 7);
insert(&root, 16);
    insert(&root, 18);

drawTree(root);

    deltree(root);
}

示例输出:

        9
    4        15
  2    6    12    17
 0      7      16  18
  

注意:现在继续向具有相同边界的节点添加边   方法。