【问题标题】:Binary tree preorder二叉树预序
【发布时间】:2021-02-24 13:45:19
【问题描述】:

我的预购方法在 main 中不起作用,但数组 elem 已正确形成(我通过打印每个步骤进行检查)。定义中使用的所有函数/方法都可以正常工作。我认为问题的出现是因为“return elem;”​​行。任何人都可以提出任何想法,这太重要了。

T* TreeNode<T>::preorder()const 
{
    T* elem = new T[elCount(left)+elCount(right)+1];
    elem[0] = data;
    TreeNode<T>* curr = left;
    Stack<TreeNode<T>*> st;
    if (right) {
        st.push(right);
    }
    int i = 1;
    while (curr) {
        elem[i++] = curr->getData();
        //std::cout << elem[i - 1];
        
        if (curr->getRight()) 
            st.push(curr->getRight());
        
        curr = curr->getLeft();
        if (!curr) 
        {
            curr = st.getTop();
            st.pop();
        }   }
    return elem;
}

【问题讨论】:

  • 此问题显示的代码不符合 stackoverflow.com 对 minimal reproducible example 的要求。这意味着这里的任何人都不太可能最终回答这个问题。但最多只能猜测。你应该edit你的问题来展示一个最小的例子,不超过一两页代码(“最小”部分),其他人都可以剪切/粘贴、编译、运行和重现所描述的问题(“可重现”部分)完全如图所示(这包括任何辅助信息,例如程序的输入)。请参阅How to Ask 了解更多信息。
  • 您如何确定它不起作用? (另外,std::vector 是你的朋友。)
  • 如果每次有人(包括我自己)说“所有这些其他功能都正常工作,所以问题一定在这里”时我有一块钱,但事实证明他们没有,我会稍微富裕一点的人。不过,return elem; 绝对不是问题的根源。
  • @SamVarshavchik 感谢您的建议。我会注意的。

标签: c++ data-structures return binary-tree preorder


【解决方案1】:

由于未指定,因此很难准确查看您要执行的操作,但您似乎正在尝试从二叉树中获取所有数据。 This GFG article 对如何遍历二叉树做了一个非常简单的解释和分解。显然你的节点更复杂,但一般逻辑是一样的。我会问自己preorder() 函数是否真的需要成为树节点类的一部分,以及单独的函数是否不会更有用。我还会考虑使用 std::vector 而不是您当前使用的 carray。如果您需要固定大小,std::array 也可能会更好。

为了展示你如何可能重写你的代码,你可以尝试类似

std::vector<int> vect;

template<class T>
void preorder(const TreeNode<T>& node, vector<T>& elem) {
    if(!node.getData()) {
        return;
    }

    elem.push(node.getData());

    if(node.getLeft()) {
        preorder(node.getLeft());
    }

    if(node.getRight()) {
        preorder(node.getRight());
    }
}

这并不完美,因为我是在脑海中写下的,但它应该为遍历二叉树和提取所有数据提供了一个简单的基础。一点点递归应该会更容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多