java - 为什么我得到的结果与我的预期相反?
问题描述
我写了一个代码来判断一个小的二叉树 t1 是否是 t2 的子树。我应该得到true
结果,但我得到了相反的结果。
这是我的代码:
class Node {
int val;
Node left, right;
public Node(int v) {
val = v;
left = right = null;
}
}
public class BT {
Node root;
public BT() {
root = null;
}
public boolean containsTree(Node t1, Node t2) {
StringBuilder s1 = new StringBuilder();
StringBuilder s2 = new StringBuilder();
getOrderString(t1, s1);
getOrderString(t2, s2);
return s1.indexOf(s2.toString()) != -1;
}
public void getOrderString(Node t, StringBuilder s) {
if (t == null) {
s.append("X");
return;
}
s.append(t.val);
getOrderString(t.left, s);
getOrderString(t.right, s);
}
public static void main(String[] args) {
BT bt = new BT();
bt.root = new Node(10);
bt.root.left = new Node(12);
bt.root.right = new Node(15);
bt.root.left.left = new Node(25);
bt.root.left.right = new Node(30);
bt.root.right.left = new Node(36);
BT bt2 = new BT();
bt2.root = new Node(10);
bt2.root.left = new Node(12);
bt2.root.right = new Node(15);
bt2.root.left.left = new Node(25);
System.out.println(bt.containsTree(bt.root, bt2.root));
}
}
谁能向我解释为什么我会变得虚假?
解决方案
您用于构建树的 API 很难阅读。如果你定义了一个构造函数:
public Node(int v, Node left, Node right)
然后你可以将你的树声明为:
bt.root = new Node(
10,
new Node(
12,
new Node(25, null, null),
new Node(30, null, null)),
new Node(
25,
new Node(36, null, null),
null));
bt2.root = new Node(
10,
new Node(
12,
new Node(25, null, null),
null)),
new Node(15, null, null));
像这样,我认为很容易看出第二个不是第一个的子树:
- 第一个值为 10 的节点有一个值为 25 的右节点;在第二个中,它的正确值为 15;
- 第一个中值为 12 的节点具有非空的右值,而在第二个中为空。
推荐阅读
- python - 为什么在使用 unittest 修补类时会出现断言错误?
- react-native - React Native Expo 音频 | 从最新位置播放直播
- jsf - 当组件在 JSTL forEach 循环中时,以编程方式使用值表达式设置属性
- oracle - 如何按ID删除自上一行以来没有变化的旧行
- python - 在 python 中从 REST API 获取数据的最快方法
- java - 急切地加载一个标记为懒惰的集合?
- javascript - 在下面的示例中,递归是如何工作的?
- redux - 在自定义钩子中访问 Redux 状态?
- python - 应用于 Pandas 系列的 Json_normalize 在“str”和“int”实例之间返回“>”不支持
- spring-boot - 使用 DataSource 时获得过多的角色连接