java - Java中的二分查找和中序遍历
问题描述
我正在研究二叉搜索树。我使用 inOrder 类型的遍历方法,但在 main 方法中出现错误。问题是为什么?我想念什么?谢谢
inOrder(S11.Tree<java.lang.Integer>.Node<java.lang.Integer>) in Tree 不能应用于(S11.Node<java.lang.Integer>)
public class Tree<T extends Comparable<T>> {
private Node<T> root;
public void add(T data) {
root = doInsert(root, data);
}
public Node<T> doInsert(Node<T> root, T data) {
if (root == null) {
return new Node<T>(data);
} else if (data.compareTo(root.data) > 0) {
root.right = doInsert(root.right, data);
} else if (data.compareTo(root.data) < 0) {
root.left = doInsert(root.left, data);
}
return root;
}
public void inOrder(Node<T> root) {
if (root != null) {
inOrder(root.left);
System.out.print(root.data + " ");
inOrder(root.right);
}
}
class Node<T> {
Node<T> left;
Node<T> right;
T data;
public Node(T data) {
this.data = data;
}
}
}
public static void main(String[] args) {
Tree<Integer> tree = new Tree<Integer>();
Node<Integer> root1 = new Node<>(8);
tree.add(3);
tree.add(10);
tree.add(1);
tree.add(6);
tree.add(14);
tree.add(4);
tree.add(7);
tree.add(13);
tree.add(18);
tree.inOrder(**root1)**;//here I get an error
}
}
解决方案
您在这里遇到设计问题以及add(T data)
方法的错误实现。
public final class Tree<T extends Comparable<T>> {
private Node<T> root;
private int size;
public void add(T val) {
Node<T> node = new Node<>(val);
if (root == null)
root = node;
else
add(root, node);
size++;
}
private void add(Node<T> parent, Node<T> node) {
if (node.val.compareTo(parent.val) < 0) {
if (parent.left == null)
parent.left = node;
else
add(parent.left, node);
} else if (parent.right == null)
parent.right = node;
else
add(parent.right, node);
}
public List<T> inOrder() {
return size == 0 ? Collections.emptyList() : Collections.unmodifiableList(inOrder(root, new ArrayList<>(size)));
}
private static <T> List<T> inOrder(Node<T> node, List<T> res) {
while (true) {
if (node == null)
return res;
inOrder(node.left, res);
res.add(node.val);
node = node.right;
}
}
// This is an internal implementation of Tree and should be hidden
// Node should not be linked with Tree instance
private static final class Node<T> {
private final T val;
private Node<T> left;
private Node<T> right;
public Node(T val) {
this.val = val;
}
}
}
输出:
Tree<Integer> tree = new Tree<>();
tree.add(8);
tree.add(3);
tree.add(10);
tree.add(1);
tree.add(6);
tree.add(14);
tree.add(4);
tree.add(7);
tree.add(13);
tree.add(18);
System.out.println(tree.inOrder()); // [1, 3, 4, 6, 7, 8, 10, 13, 14, 18]
推荐阅读
- node.js - Node js在单个项目下创建Dialogflow代理
- mysql - Illuminate\Database\QueryException : SQLSTATE[HY000] [1044] 用户 ''@'localhost' 拒绝访问数据库 'forge'
- sql-server - xml /XSD 文件源 ssis 2010 - 根级别的数据对 SQL Server 表无效
- laravel - 从数据库中检索问题并将其显示在单选按钮中
- powershell - 用于循环的 Power Shell 脚本?
- r - R中比例函数的统计公式
- schema.org - 组织标志需要网址
- javascript - 重构JS对象数组
- python - Python Beautiful soup:针对特定元素
- appium - 无法启动 Chromedriver 会话:无法创建新会话。详细信息:未创建会话:Chrome 版本必须介于 71 和 75 之间