二叉树预购

Binary tree preorder

本文关键字:二叉树      更新时间:2024-09-21

我的预购方法在main中不起作用,但数组elem已经正确形成(我在每一步打印时都进行了检查(。定义中使用的所有函数/方法都能正常工作。我认为问题的出现是因为";返回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()函数是否真的需要成为树节点类的一部分,以及单独的函数是否更有用。我也会考虑使用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());
}
}

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