我理解递归的想法,而不是实现。我不明白你如何传入一个不是根的节点。我有一个头文件和一个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){
}
答案 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;
}