特定のツリーが BST かどうかを調べるコードを作成しました。しかし、私はそれをリファクタリングする助けが必要です。私が探しているもののいくつかは次のとおりです。
- 一時変数を取り除く (Martin Fowler の提案による)
- leftTreeMax と RighTreeMin メソッドの組み合わせ
- より良いメソッド名
また、人々が持っている他のリファクタリングのアイデアをいただければ幸いです。
package com.cc.bst;
import com.cc.queue.Queue;
import com.cc.trees.BinaryTreeNode;
public class IsBinaryTreeBST {
public static boolean binaryTreeBST ( BinaryTreeNode root) {
if (root == null) {
return false;
}
int maxVal = leftTreeMax(root.getLeft());
int minVal = rightTreeMin(root.getRight());
int rootVal = root.getData();
if (maxVal == 0 || minVal == 0 ) {
return false;
}
if (rootVal > maxVal && rootVal < minVal) {
return true;
}
return false;
}
private static int leftTreeMax (BinaryTreeNode node) {
if (node == null) {
return 0;
}
Queue nodeQueue = new Queue();
nodeQueue.enqueue(node);
int maxValue = node.getData();
while (!nodeQueue.isEmpty()) {
BinaryTreeNode tempNode = (BinaryTreeNode) nodeQueue.dequeue();
BinaryTreeNode left = tempNode.getLeft();
BinaryTreeNode right = tempNode.getRight();
if (left != null ) {
if (left.getData() > tempNode.getData()) {
return 0;
}
nodeQueue.enqueue(left);
}
if (right != null) {
if ( tempNode.getData() > right.getData()) {
return 0;
}
nodeQueue.enqueue(right);
}
if (tempNode.getData() > maxValue) {
maxValue = tempNode.getData();
}
}
System.out.println("---------- maxVal -------->" + maxValue);
return maxValue;
}
private static int rightTreeMin(BinaryTreeNode node) {
if (node == null) {
return 0;
}
Queue nodeQueue = new Queue();
nodeQueue.enqueue(node);
int minValue = node.getData();
while (!nodeQueue.isEmpty()) {
BinaryTreeNode tempNode = (BinaryTreeNode) nodeQueue.dequeue();
BinaryTreeNode left = tempNode.getLeft();
BinaryTreeNode right = tempNode.getRight();
System.out.println("---------- tempNode -------->" + tempNode.getData());
if (left != null ) {
System.out.println("---------- left -------->" + left.getData());
if (left.getData() > tempNode.getData()) {
return 0;
}
nodeQueue.enqueue(left);
}
if (right != null) {
if ( tempNode.getData() > right.getData()) {
return 0;
}
System.out.println("---------- right -------->" + right.getData());
nodeQueue.enqueue(right);
}
if (tempNode.getData() < minValue) {
minValue = tempNode.getData();
}
}
System.out.println("---------- minVal -------->" + minValue);
return minValue;
}
}