再帰なしで2分探索木を渡り歩こう! Java編

どもども。
どうも寝ている間に偏頭痛がきたらしく,現在しんどい whitypig です。
というのも,途中,頭が痛くて起きたのだ。けど,非常にねみかったので,
頑張って寝た。当方,寝る前には冷えピタを張るようにしているので,
それで多少は和らいだか。
それでも頭を振ったりすると,痛い。


そうそう。プロテインを飲まないと,偏頭痛が訪れる確率が高い,
という何とも不思議なデータが取れた。
去年の正月,実家に帰ったときもそうだった。
プロテインと行っても,ザバスのウェイトダウンね。ソイ。
他にもミネラルやらなんやらが入っているらしい。
すでに届いたのですが,昨日はちょうど切らしていて,飲めなかったのです。
以前,マグネシウムをとるといいかもよ,と言われてから,マルチビタミンとか,
マルチミネラルをがしがし飲み始めたんですが,それ以降,発現頻度が下がった気がする。
なんか関係あるのかもね〜。


いやー,前置きが長くなりましたな。
現在,Java やり中なので,こないだの,2分探索木を再帰なしで渡り歩く,
Java で書いてみようと思い,書いた次第です。

class Node {
  // この辺は,private にするべき?
  Node parent;
  Node left;
  Node right;
  int data;

  Node(Node parent, int data) {
    this.parent = parent;
    this.left = null;
    this.right = null;
    this.data = data;
  }

  Node(Node parent, Node left, Node right, int data) {
    this.parent = parent;
    this.left = left;
    this.right = right;
    this.data = data;
  }

  // フィールドを private にしなければ,いらんちゃーいらんか。
  public void setLeft(Node node) {
    left = node;
  }

  public void setRight(Node node) {
    right = node;
  }

  public void printNode() {
    System.out.print(data + ", ");
  }

}

public class BinSearchTree {
  private static Node root;

  public static void main(String[] args) {
    setupTree();
    traverse(root);
    System.out.println("");
  }

  /**
   * 2分木を,再帰を使わずに,渡り歩く。
   */
  private static void traverse(Node root) {
    Node prev = root.parent;
    Node curr = root;

    while (curr != null) {
      if (prev == curr.parent) {
        // 左部分木があるかどうかチェック。
        if (curr.left != null) {
          // あれば,それを見に行く。
          prev = curr;
          curr = curr.left;
          continue;
        }
        else {
          // なければ,見たことにする。
          prev = curr.left;
        }
      }

      // 左部分木を見たので,次は右。
      // 左部分木を見たときと同様の処理。
      if (prev == curr.left) {
        curr.printNode();
        // 右部分木があれば,見に行くよ。
        if (curr.right != null) {
          prev = curr;
          curr = curr.right;
          continue;
        }
        else {
          // なければ見たことに。
          prev = curr.right;
        }
      }

      // 右にいって帰ってきた。
      if (prev == curr.right) {
        // 上に1つ上る
        prev = curr;
        curr = curr.parent;
      }
    }
  }

  /**
   * お助けメソッド。
   */
  private static void setupTree() {
    root = new Node(null, 10);
    Node left = new Node(root, 5);
    root.setLeft(left);
    Node lleft = new Node(left, 2);
    left.setLeft(lleft);
    Node right = new Node(root, 15);
    root.setRight(right);
    Node rleft = new Node(right, 13);
    Node rright = new Node(right, 18);
    right.setLeft(rleft);
    right.setRight(rright);
  }
}
% javac BinSearchTree.java

% java BinSearchTree
2, 5, 10, 13, 15, 18, 

こないだと同じく,たぶん大丈夫なはず。