二分木に関しては、再帰的に実行できるトラバーサルにはいくつかの種類があります。それらは、参照されてからアクセスされた順序で書き込まれます(L =左の子、V =そのノードにアクセス、R =右の子)。
- インオーダートラバーサル(LVR)
- 逆順走査(RVL)
- プレオーダートラバーサル(VLR)
- ポストオーダートラバーサル(LRV)
コードはポストオーダートラバーサルメソッドを実行しているように見えますが、いくつかの問題が混同されています。まず、ノードはトラバースしたいものです。データはあなたが訪問したいものです。次に、これが実装されている方法で、ノード自体を返す理由はありません。あなたのコードでは、「この特定のデータを探しています。Node@ 0xdeadbeefさんがいますか?」という条件を許可していません。これは、ある種の追加の検索パラメーターで見つかります。
アカデミックBSTトラバーサルは、ノード自体のみを出力します。検索機能を追加したい場合は、もう1つのパラメーターと、適切なノードの追加チェックが必要です。
スニペットは次のとおりです。
// 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;
}