java - 在二叉树中打印无法通过二分搜索搜索到的节点
问题描述
我正在尝试打印所有无法通过二叉搜索算法搜索的二叉树节点。由于 BST 也基于二进制搜索算法,所以我试图打印不符合 BST 结构的节点。
下面的代码片段在右叶值大于根的根的情况下失败,例如:
public class PrintBinarySearchable {
static class Node {
int key, height;
Node left, right;
public Node(int d) {
key = d;
left = right = null;
}
}
Node prev;
private void printSearchable(Node node, Node prev, boolean isRight) {
if (node == null)
return;
if (prev == null)
System.out.print(node.key + " ");
printSearchable(node.left, node, false);
if (!isRight && prev != null && node.key < prev.key)
System.out.print(node.key + " ");
if (isRight && prev != null && node.key > prev.key)
System.out.print(node.key + " ");
printSearchable(node.right, node, true);
}
public static void main(String[] args) {
Node root = new Node(7);
root.left = new Node(2);
root.right = new Node(9);
root.left.left = new Node(1);
root.left.right = new Node(51);
PrintBinarySearchable tree = new PrintBinarySearchable();
tree.printSearchable(root);
}
private void printSearchable(Node root) {
printSearchable(root, null, false);
}
}
解决方案
这感觉像是一项家庭作业,所以我不会在这里给出完整的答案。相反,我会给你一些关于如何解决这个问题的提示。
- 与其担心一个节点是左还是右以及它的父节点是什么来确定它是否可搜索,不如从父节点进行检查。如果您有父级,则可以确定其子代是否可搜索。
- 如果您是从父级做出决定,则递归中不需要特殊情况 - 只需调用
printSearchable(node.right);
andprintSearchable(node.left)
withinprintSearchable
。然后你可以打电话printSearchable(root)
,它会打印所有的节点。
推荐阅读
- java - 序列化arraylist时出错。获得 NotSerializable 异常..即使在实现 Serializable 之后
- angular - 如何在我的服务中删除事件监听器?
- java - ++i 和 i++ 与 finally{} 之间的 Java 区别
- scala - 如何使用 foreach 拆分 Spark 数据框中的 Json 格式列值
- c# - 隔离 EF Core 中的更改
- php - 如何在php中对sql数据的输出进行排序
- sql - Golang 连接到 Cubrid
- reactjs - 未识别 SignalR 连接的 React 和 SignalR 中的问题
- c - 如何使用此正则表达式避免 regcomp 错误 13?
- c++ - 不向socket.io nodejs(服务器)发出数据socket.io c++(客户端)