0

我的 BST 的根名为 pTree。它由以下人员声明:

KnightTree* tree;

现在我需要编写一个带有指向根的新指针的函数(在这种情况下是“树”),并且如果我使用 pTree=pTree->pLeftChild; 则永远不会更改事件;或 pTree=pTree->pRightChild;在我调用下面的函数之前,我声明:

KnightTree* treeroot=tree;

然后我调用函数:

ReadNLR(tree,treeroot);

功能是这样的:

void ReadNLR(KnightTree*&tree,KnightTree* treeroot)
{
    if(tree !=NULL)
    {
        cout<<tree->key<<" is at the depth of "<<NodeDepth(treeroot,tree)<<endl;
        cout<<treeroot->key<<endl;
        ReadNLR(tree->pLeftChild,treeroot);
        ReadNLR(tree->pRightChild,treeroot);
    }
}

我的想法是进行 NLR 读取,读取的每个节点都会打印出它的深度。但是我在这里遇到的问题是树根就像树的副本,它们是相同的,因此深度始终为 1(从节点到根的距离加 1)。如何从初始树根声明树根,即使树改变也永远不会改变?谢谢,对不起我的英语!

4

1 回答 1

0

乍一看,您的代码看起来不错,只是树参数没有理由是对指针的引用。我的猜测是有什么问题NodeDepth。一个建议是只跟踪你去的水平,而不是重新计算它。您的函数对树进行深度优先扫描,然后看起来像这样:

void ReadNLR(KnightTree* tree, int level)
{
    if (tree == NULL)
        return;

    cout << tree->key << " is at the depth of " << level;
    ReadNLR(tree->pLeftChild, level + 1);
    ReadNLR(tree->pRightChild, level + 1);
}

ReadNLR您可以通过使用root0作为参数调用来启动打印过程。

您还可以使用队列逐级打印树 - 如果您仍然需要帮助,我会尽快发布。

于 2012-12-04T14:44:23.300 回答