对于二叉树,有几种不同类型的遍历可以递归完成。它们是按照它们被引用然后访问的顺序编写的(L = 左孩子,V = 访问该节点,R = 右孩子)。
- 中序遍历 (LVR)
- 逆序遍历 (RVL)
- 前序遍历(VLR)
- 后序遍历 (LRV)
您的代码似乎正在执行后序遍历方法,但您混淆了一些东西。首先,节点就是你要遍历的;数据就是您要访问的内容。其次,您没有理由以实现方式返回节点本身。您的代码不允许有条件说“我正在寻找这个特定的数据,你有 Node@0xdeadbeef 先生吗?”,可以通过某种额外的搜索参数找到它。
学术 BST 遍历只打印节点本身。如果你想添加一个搜索功能,它只是一个额外的参数,以及对正确节点的额外检查。
这是一个片段:
// Academic
public void traverse (Node root){ // Each child of a tree is a root of its subtree.
if (root.left != null){
traverse (root.left);
}
System.out.println(root.data);
if (root.right != null){
traverse (root.right);
}
}
// Search with a valid node returned, assuming int
public Node traverse (Node root, int data){ // What data are you looking for again?
if(root.data == data) {
return root;
}
if (root.left != null && data < root.data) {
return traverse (root.left, data);
}
if (root.right != null && data > root.data) {
return traverse (root.right, data);
}
return null;
}