C++ 在二元搜索树中打印节点的值,print_node(const node*n)

C++ 在二元搜索树中打印节点的值,print_node(const node*n),c++,algorithm,nodes,binary-search-tree,C++,Algorithm,Nodes,Binary Search Tree,我理解递归的思想,只是不理解实现。我不明白如何传入非根节点。我有一个头文件和一个ccp。node类是BST类的私有子类。所以我猜它是从BST类内部调用的。但是如何遍历树并匹配节点呢? 节点是否可比较节点n==根->左? 比较n->value==root->left->value的值是否更好?然后如果它们相等,打印出值? 既然我也不能更改节点,我该如何递归地调用它?我应该走一条包含两个节点的辅助函数的路线吗?常数Node*n和一个Node*t,比方说 class BST { class Node

我理解递归的思想,只是不理解实现。我不明白如何传入非根节点。我有一个头文件和一个ccp。node类是BST类的私有子类。所以我猜它是从BST类内部调用的。但是如何遍历树并匹配节点呢? 节点是否可比较节点n==根->左? 比较n->value==root->left->value的值是否更好?然后如果它们相等,打印出值? 既然我也不能更改节点,我该如何递归地调用它?我应该走一条包含两个节点的辅助函数的路线吗?常数Node*n和一个Node*t,比方说

class BST {
class Node { // binary tree node
public:
    Node* left;
    Node* right;
    Value value;
    int level;
    Node(const Value v = Value(), int lev = 1)
        : value(v), level(lev), left(nil), right(nil)
    {}
    Value& content() { return value; }

}; // Node

Node* root;
公众: void print_nodeconst Node*n{//打印节点的值

}

Value print_node(const Node *n, Node *t){

}

如果没有代码或更好的描述,我将做很多工作,因此我将解释关于“根”与“节点”的问题

首先,“根”是一种节点类型。就代码而言,它实际上看起来不应该与其他节点对象有任何不同,应该通过node*root=new node进行设置;“根”只是一个名称,我们给出了一种特殊类型的节点,它没有父节点,并且不保证有一个全新的数据结构。如果我使用Person类和字段性别,您可以将任何Person*Person=newperson;object描述为“女性”,因为该字段 性别==女性,无需创建名为女性的全新类

因此,由于树的递归实现不经常查看父节点,因此传递“根”应该与传递常规节点完全相同。如果您在粗略的伪代码中定义了以下方法:

define BSTVisit(Node* node, Node* nodeToFind) {
    switch (compareNodes(node, nodeToFind)) {
        case MATCH:
            print(node->name);
            break;
        case LESS_THAN:
            BSTVisit(node->leftChild, nodeToFind);
            break;
        case MORE_THAN:
            BSTVisit(node->rightChild, nodeToFind);
            break;
    }
}

您可以通过调用BSTvisitorot、nodeToFind来启动代码。从那里,它会将“root”视为常规节点,根据需要访问其子节点,并继续执行,直到完成为止。

下面是一个树遍历如何非递归的示例,我们从根开始,检查每个节点上的键值。如果递归深度太大,则ig即使二叉树遍历的可能性不大,并且递归遍历比非递归遍历慢,它也可能导致堆栈溢出

template <class T>
Node* BinTree<T>::findParent(const T& key, bool& bExist) const
{
    Node* parent = root;
    bExist = false ;
    while(root)
    {
        parent = root ;
        if ( key < root->key )
            root = root->left ;
        else if ( key > root->key )
            root = root->right ;    
        else
        {
            bExist = true ;
            return root ;
        }
    }

    return parent;
}

请展示代码。不要仅仅描述它。为什么要使用递归遍历树?它效率更低,并且不建议递归深度更大。您试图做什么:打印整个树,打印特定节点,或者找到一个节点然后打印?@BajMile递归是遍历树的自然方式平衡BST的深度是log2节点数,这并不多——一棵深度为32的树实际上包含数十亿个节点。@molbdnilo——你正在读的算法书是什么?遍历可以很容易地完成,而无需递归,递归速度慢且危险,例如,大树可能导致堆栈溢出