【问题标题】:print trees in preorder separated by commas以逗号分隔的按顺序打印树
【发布时间】:2013-03-10 16:23:37
【问题描述】:

为了正常工作,我有以下功能来打印树:

void PrintInOrder(TTreeNode const * const pRoot) {
    if (pRoot != 0) {
        PrintInOrder(pRoot->pLeft);
        if(pRoot->pLeft) std::cout << ",";
        std::cout << pRoot->Data;
        if(pRoot->pRight) std::cout << ",";
        PrintInOrder(pRoot->pRight);
    }
}

这是我的预购打印功能:

void PrintPreOrder(TTreeNode const * const pRoot)  {
    if (pRoot != 0) {
        std::cout << pRoot->Data << std::endl;
        PrintPreOrder(pRoot->pLeft);
        PrintPreOrder(pRoot->pRight);
    }
}

因为我太笨了,不知道如何像 inorder 函数那样分开打印,希望大家能帮帮我!

谢谢!

更新:

预购功能现在可以使用,那么这是正确的后购功能吗?

void PrintPostOrder(TTreeNode const * const pRoot)  {
        if (pRoot != 0) {
            PrintPostOrder(pRoot->pLeft);
            if(pRoot->pLeft) std::cout << ",";
            PrintPostOrder(pRoot->pRight);
            if(pRoot->pRight) std::cout << ",";
            std::cout << pRoot->Data;
        }
 }

【问题讨论】:

  • 欢迎来到 Stack Overflow。请尽快阅读FAQ。在PrintInOrder() 函数中,您已经得到了 90% 或更多的答案。将其调整为 PrintPreOrder()PrintPostOder() 函数是一项简单的编辑练习。

标签: c++ tree preorder


【解决方案1】:
void PrintPreOrder(TTreeNode const * const pRoot)  {
    if (pRoot != 0) {
        std::cout << pRoot->Data << std::endl;
        if(pRoot->pLeft || pRoot->pRight) std::cout << ",";
        PrintPreOrder(pRoot->pLeft);
        if(pRoot->pLeft && pRoot->pRight) std::cout << ",";
        PrintPreOrder(pRoot->pRight);
    }
}

另外请注意,这将在前序遍历中打印树。

【讨论】:

  • 感谢您的帮助,在我的问题中混合了预购和后购。
【解决方案2】:

这是正确的做法:

void PrintPreOrder(TTreeNode const * const pRoot)  {
    if (pRoot != 0) {
        std::cout << pRoot->Data << std::endl;
        // take care of left node
        if(pRoot->pLeft || pRoot->pRight) std::cout << ",";
        PrintPreOrder(pRoot->pLeft);
        // take care of right node
        if(pRoot->pLeft && pRoot->pRight) std::cout << ",";
        PrintPreOrder(pRoot->pRight);
    }
}

【讨论】:

    【解决方案3】:
    您的有序版本:
    1. 访问左子树。
    2. 打印根的数据。
    3. 访问右子树。
    预购版你想做的是:
    1. 打印根的数据。
    2. 访问左子树。
    3. 访问右子树。

    所以它应该是这样的:

    void PrintPreOrder(TTreeNode const * const pRoot) {
        if (pRoot) {
    
            // print the root:
            std::cout << pRoot->Data;
            
            // visit the left subtree:
            if (pRoot->pLeft) {
                std::cout << ",";
                PrintPreOrder(pRoot->pLeft);
            }
            
            // visit the right subtree:
            if (pRoot->pRight) {
                std::cout << ",";
                PrintPreOrder(pRoot->pRight);
            }
        }
    }
    

    【讨论】:

    • 所以我真的不需要之前发布的 OR 和 AND 条件?
    • @schreda:这只是表达相同逻辑的另一种方式。如果有左或右,则打印 1 个逗号,如果两者都有,则打印 2 个逗号。我的代码的结果是一样的:)
    【解决方案4】:

    我知道这已经有好几年了,但仍然很有帮助!

    我自己想知道如何做到这一点,发现了这个问题,但意识到有一个简单的答案:

    void Preorder(Node* root){
      if(root==NULL){
        return;
      }
      cout << root->data << " ";
      Preorder(root->left);
      Preorder(root->right);
    }
    

    你从树的根开始。如果根是null,则代码完成。

    否则,打印出该节点的数据。

    然后,我们在该节点的leftright 子树上调用Preorder,它现在是它自己的子树的root。重要的是我们首先调用左子树,因为这是前序(后序的右子树)。

    我们检查root 是否为null,因此我们不必担心左子树是否为nullright 子树分别为null。如果节点是null,则回溯。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-10
      • 2015-01-06
      • 2017-12-19
      相关资源
      最近更新 更多