我理解递归的想法,而不是实现 . 我不明白你如何传入非root的节点 . 我有一个头文件和一个ccp . 节点类是BST类的私有子类 . 所以我猜它是从BST课程中调用的 . 但是如何遍历树并匹配节点?节点是否可比(节点n ==根 - >左)?比较值,(n-> value == root-> left-> value)会更好吗?如果它们相等则打印出值?既然我也无法改变节点,我该如何递归调用呢?我应该走一个包含两个节点的辅助函数的路径吗?比方说,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;
public:void print_node(const Node * n){//打印节点的值 .
}
Value print_node(const Node *n, Node *t){
}
2 回答
没有代码或更好的描述就做不了多少,所以我将解释你似乎围绕'root'与'node'的问题 .
首先,'root'是一种节点 . 代码方面,它实际上看起来不应该与其他节点对象有任何不同,应该通过
Node* root = new Node();
'Root'设置只是一个名称,我们给出一个没有父节点的特殊类型的节点,并且不保证全新的数据结构体 . 如果我使用带有gender
字段的Person
类的单独示例,则可以将Person* person = new Person();
对象描述为'female'只是因为字段gender == female"
,而不必创建一个名为Female
的全新类 .除此之外,由于树的递归实现通常不会查看父项,因此传递“根”应该与传递常规节点完全相同 . 如果您在粗糙伪代码中定义了以下方法:
您可以通过调用
BSTVisit(root, nodeToFind)
来启动代码 . 从那里它将'root'视为常规节点,根据需要访问其子节点,并继续直到它完成 .下面是树遍历可以是非递归的示例,我们从根开始并检查每个节点的键值 . 如果递归深度太大,则可能导致堆栈溢出(即使二进制树遍历不太可能),并且递归遍历比非递归遍历慢 .