打印二进制搜索树中的节点print_node(const Node * n)的值

时间:2015-02-03 20:22:47

标签: c++ algorithm nodes binary-search-tree

我理解递归的想法,而不是实现。我不明白你如何传入一个不是根的节点。我有一个头文件和一个ccp。节点类是BST类的私有子类。所以我猜测它是从BST课程中调用的。但是如何遍历树并匹配节点? 节点是否可比(节点n ==根 - >左)? 比较值,(n->值== root-> left->值)会更好吗?然后,如果他们等于打印出值? 因为我也无法改变节点,我如何递归调用它?我应该走一个包含两个节点的辅助函数的路径吗? const 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_node(const Node * n){//打印节点的值。

}

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

}

2 个答案:

答案 0 :(得分:0)

没有代码或更好的描述就无法做多少,所以我将解释你似乎围绕'root'与'node'的问题。

首先,'root'是一种节点。代码方面,它实际上看起来不应该与其他节点对象有任何不同,应该通过Node* root = new Node();设置'Root'只是一个名称,我们给出一个没有父节点的特殊类型的节点,并且不保证全新的数据结构。如果我使用带有字段Person的{​​{1}}类的单独示例,您可以将任何gender对象描述为“女性”,因为该字段 Person* person = new Person();,无需创建名为gender == female"的全新类。

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

Female

您可以通过调用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; } } 来启动代码。从那里它将'root'视为常规节点,根据需要访问其子节点,并继续直到它完成。

答案 1 :(得分:0)

以下是树遍历可以是非递归的示例,我们从根开始并检查每个节点的键值。如果递归深度太大,则可能导致堆栈溢出(即使二进制树遍历不太可能),并且递归遍历比非递归遍历慢。

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;
}