Требуется объяснение конструктора класса Java для дерева

В вопросе об алгоритме в описании говорится следующее:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */

Мой вопрос 1: Трудно понять, что такое TreeNode(int x) { val = x; }, пожалуйста, объясните, что означает эта строка. Зачем это нужно.

Мой вопрос 2: как вставить TreeNode(int x) { val = x; } в реальный код конструктора? это то, что я пробую до сих пор, но получаю ошибку:

  TreeNode (int val, TreeNode left, TreeNode right, TreeNode x){
    this.left = left;
    this.right = right;
    this.x = { val = x; }
    this.val = val;
  }
}

Ошибка: недопустимое начало выражения в строке this.x = { val = x; }

это довольно стандартный Java-материал. Изучите сначала основы, прежде чем погружаться в структуру данных / алгоритм

Mạnh Quyết Nguyễn 20.05.2018 19:47

Я ценю быстрое принятие. И я тоже согласен: это базовые вещи. И обычно я бы только прокомментировал, но мне нужно было место, чтобы изложить основные моменты.

GhostCat 20.05.2018 20:27

@GhostCat Я согласен. Я запутался и подумал, что строка - это и тип поля, и имя поля. И изо всех сил пытался выбраться из этого замешательства. Но это здорово, что ты сразу понял, в чем мои мысли.

Bighuyou 20.05.2018 20:35
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
3
586
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вас как будто ослепило форматирование. В комментарии не должно быть первого конструктора. Вместо этого ваш класс может выглядеть так:

public class TreeNode {
  int val;
  TreeNode left;
  TreeNode right;

  TreeNode(int x) { 
    val = x; 
  }

TreeNode (int val, TreeNode left, TreeNode right){
  this.left = left;
  this.right = right;
  this.val = val;
}

Параметры конструктора обычно назначаются полям вашего класса. И вы просто запутали (себя), предположив, что вам снова нужен этот фрагмент { val = x }. Но это всего лишь полное тело первого конструктора.

И, чтобы быть точным, на самом деле вы бы предпочли сделать что-то вроде

  TreeNode(int x) { 
    this(x, null, null); 
  }

Другими словами: когда вы создаете свой узел первый, вам нужно только значение, его левый / правый дочерние узлы в этот момент равны нулю. Поэтому вместо двух разных тел конструктора первый конструктор просто вызывает второй конструктор (чтобы избежать дублирования кода).

Благодарность! это отвечает на мой вопрос. Но у вас есть один вопрос для вашего сообщения, вы имеете в виду, что мне не нужен второй конструктор, и только первый конструктор может позаботиться о создании первого узла с нулевым левым и правым, а также добавлением левого / правого узла к этому первому узлу?

Bighuyou 20.05.2018 20:01

Да, это возможно.

GhostCat 20.05.2018 20:25

Другие вопросы по теме