繁体   English   中英

二叉树预序

[英]Binary tree preorder

我的预购方法在 main 中不起作用,但数组元素已经正确形成(我通过打印每一步来检查它)。 定义中使用的所有函数/方法都可以正常工作。 我认为问题的发生是因为行“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;
}

由于未指定,因此很难确切地看到您正在尝试做什么,但您似乎正在尝试从二叉树中获取所有数据。 这篇 GFG 文章对如何遍历二叉树做了一个非常简单的解释和分解。 显然你的节点更复杂,但大体逻辑是一样的。 我会问自己preorder() function 是否真的需要成为树节点 class 的一部分,如果一个单独的 function 不会更有用一点。 我还会考虑使用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());
    }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM