Почему я получаю результат, противоположный тому, что я ожидал? - PullRequest
1 голос
/ 19 февраля 2020

Я написал код, чтобы выяснить, является ли небольшое двоичное дерево 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));
    }
}

Может ли кто-нибудь объяснить мне, почему я получаю ложь?

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

Ваш 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 в первом имеет ненулевое правильное значение, тогда как во втором он равен нулю.
0 голосов
/ 19 февраля 2020

2-е дерево не является поддеревом 1-го. Вот почему он возвращает false, поэтому ваш код на самом деле правильный:)

First and Second Trees

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...