微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

二叉树预订

如何解决二叉树预订

我的预订方法从主要方法不起作用,但是数组元素已经正确形成(我在打印每一步时都进行了检查)。定义中使用的所有功能/方法均能正常工作。我认为问题是由于“ 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;
}

解决方法

很难准确地看到您未指定的内容,但是似乎您正在尝试从二进制树中获取所有数据。 This GFG article对如何横穿二叉树进行了非常简单的解释和细分。显然,您的节点更复杂,但是总体逻辑是相同的。我想问一问关于preorder()函数是否确实需要成为树节点类的一部分,以及一个单独的函数是否会更有用。我还考虑使用std::vector而不是您当前使用的手纸。如果您需要固定大小,则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());
    }
}

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。