【问题标题】:In order tree traversal顺序树遍历
【发布时间】:2020-07-16 19:34:06
【问题描述】:

给定一个二叉树遍历程序,如何修改下面的遍历函数,使其返回类型为 std::string 并在同一行打印每个节点的名称?

void traverse(Node* head){
    if(head == nullptr) {
        return;
    }
    traverse(head->left);       //Visit left subtree
    std::cout << head->name;
    traverse(head->right);      // Visit right subtree   
}


【问题讨论】:

    标签: c++ algorithm data-structures tree binary-tree


    【解决方案1】:

    你可以这样写:

    std::string traverse(Node* head){
        if(head == nullptr) {
            return "";
        }
        std::string s = traverse(head->left);       // Visit left subtree
        s += head->name + " ";
        s += traverse(head->right);                 // Visit right subtree
        return s;
    }
    

    但如果你的树是竹子:

           a  <- root
          / \
    nullptr  b
            / \
     nullptr  ...
                \
                 z
                / \
         nullptr   nullptr
    

    上面代码的复杂度将是O(n^2),因为右子树字符串总是被复制,没有简单而优雅的方法来逃避它。

    所以最好不要返回字符串,而是传递对字符串的引用:

    void traverse(Node* head, std::string& s){
        if(head == nullptr) {
            return;
        }
        traverse(head->left, s);       // Visit left subtree
        s += head->name + " ";
        traverse(head->right, s);      // Visit right subtree
    }
    

    【讨论】:

    • 这里不是很有用,但你可以通过总是复制较小的子树来获得O(n log n)
    • @BessieTheCow 是的,但这里的关键问题是必须保存字符串的顺序,无论如何右边都附加到左边,所以右边的空间将在左边重新分配,我理解的那个技巧不会不在这里工作。
    • 哦对了,我忘了。我想技术上你可以使用std::deque&lt;char&gt;...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-20
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多