在C ++中使用指定的缩进级别打印二叉树

时间:2014-12-09 01:21:45

标签: c++ binary-tree indentation

我在打印二叉树时遇到问题。基本上每个节点包含两个值 - 键和数据。问题出在这个任务上,

  

我应该使用双空格而不是\ t。基本上它意味着,\ t = 2个空格,\ t \ t = t个空格,\ t \ t \ t \ t = 6个空格

我的问题是,我已按以下方式实现了printIndented方法 -

void 
TreeDictionary::printIndented(TreeNode * node, int level) {
        if (node == NULL) 
               return; 
        if (level == 0) 
        { 
            std::cout << node->_key << ':' << node->_data << "\n"; 
            level++; 
            printIndented(node->_left, level); 
            printIndented(node->_right, level); 
        } 
        else 
        { 
                if ((node->_left == NULL) && (node->_right == NULL)) 
                        cout << '\t'; 
                cout << "\t" << node->_key << ':' << node->_data << endl; 
                if ((node->_left != NULL) && (node->_right != NULL)) 
                        cout << '\t'; 
                printIndented(node->_left, level); 
                if ((node->_left != NULL) && (node->_right != NULL)) 
                        cout << '\t'; 
                printIndented(node->_right, level);     
        } 
}

给我一​​个输出如下 -

---=WHAT I AM GETTING=---
pineapple:0
        kiwi:1
                grapes:3
                apple:5
                orange:6
        lime:8
        olives:9
                mango:10
        strawberry:4
                watermelon:7

---=EXPECTED OUTPUT=--- (as you see it prints 2 spaces instead of each \t)
pineapple:0
  kiwi:1
    grapes:3
      apple:5
        NULL
        NULL
      NULL
    orange:6
      lime:8
        NULL
        olives:9
          mango:10
            NULL
            NULL
          NULL
      NULL
  strawberry:4
    NULL
    watermelon:7
      NULL
      NULL

似乎我无法考虑NULL值,并且只要找到NULL条目就打印NULL。感谢所有帮助!

注意:预期输出是默认缩进级别,该程序为0。

2 个答案:

答案 0 :(得分:2)

您并非真正使用了解自己所处的水平所获得的信息。可以将其视为屏幕最左边的缩进。每个级别你想要缩进2 *级空格。从输出中,它看起来像一个NULL节点打印出NULL。您可以尝试以下方式:

Indent(Treenode *node, int level){
  std::cout << std::string(2*level, ' ');
  if(node == NULL){
     std::cout << "NULL" << std::endl;
  }else{
    std::cout << node->_key << ":" << node->_data << std::endl;
    level += 1;
    Indent(node->_right, level);
    Indent(node->left, level);
  }
}

答案 1 :(得分:0)

首先,您还应该检查0级的第一个节点是否有子节点。否则,如果树中只有一个节点,则可能会遇到错误。

其次,我鼓励你在if语句之后使用卷曲括号,这是令人困惑的,不太可读:

if((node->_left != NULL) && (node->_right != NULL)) { 
    cout << "\t"; //or in your case maybe: cout << " "; //see point 3
}

第三点,当你想要打印空格而不是&#39; \ t&#39;你应该做&#39; &#39;而不是&#39; \ t&#39;。你也使用&#34; \ t&#34;,这是打印字符串而不是字符的语法,这没有错,但我认为你需要理解这个原理。 &#39; \吨&#39; = const char,&#34; \ t&#34; = const string

第四,我真的不明白你用不同类型的缩进打印的标准是什么,所以如果你能用if语句解释你想要完成什么,那么我可以解释一下也是你。

如果您有任何疑问或者您觉得这没有用,请告诉我:) 祝你好运!