Печать бинарного дерева java

Русские Блоги

Оставый алгоритм Бога: как печатать бинарное дерево (версия Java) более интуитивно

Этот вопрос возникает из «Руководства Zuo Shen» «Код программиста» «Как печатать двоичное дерево более интуитивно».

тема

Бинарное дерево может быть описано тремя обычными результатами обхода, но оно недостаточно интуитивно, особенно когда есть повторение в бинарном дереве, еще сложнее построить реальную структуру бинарного дерева, только через результаты. Три обхода. Совершенно невозможно.

Учитывая головку узла головного узла для двоичного дерева. Тип бинарного значения узла дерева составляет 32 -битное целое число. Пожалуйста, реализуйте функцию печатного двоичного дерева, которое может визуально отображать форму дерева и легко нарисовать реальную структуру.

отвечать

Это более открытая тема. Недвижимость должна не только разработать метод печати, который соответствует требованиям и не дает двусмысленности, но также учитывает сложность. Когда собеседование, интервью, необходимо не соответствовать требованиям кодовых интервью Анкет Эта книга дает осознание требований, которые соответствуют требованиям, а код не большой. Я надеюсь, что читатели также смогут реализовать и оптимизировать свой дизайн. Конкретный процесс заключается в следующем:

1 Дизайвый стиль печати. Проблема, которую должна сначала решить недвижимость, состоит в том, чтобы напечатать бинарное дерево без двусмысленности. Например, двоичное дерево показано на рисунке 3-4.


Для двоичного дерева, показанного на рисунке 3-4, стиль печати, разработанный в этой статье, показан на рисунке 3-5.

Давайте объясним, как взглянуть на результаты печати.

Прежде всего, двоичное дерево собирается повернуть результат печати на 90 ° по часовой стрелке. Читатель может сравнить результат печати результата печати (то есть 3-5 по часовой стрелке на рисунке 3-5). Отношения;

Далее, как четко определить родительский узел любого узла?

  • Если префикс и суффикс результата печати узла: H «(Как показано на рисунке 3-5» «» H1H «) Это означает, что этот узел является головным узлом, и, конечно, нет родительского узла.
  • Если префикс и суффикс результата печати узла: v «Это означает, что родительский узел находится в первом столбце узла, под узлом, и ближайший узел из узла.
    Например, «на рисунке 3-5» v3v ”“ v6v «а также» v7v «, Узел отца есть» H1H ”“ v3v «а также» ^4^ ”。
  • Если префикс и суффикс результата печати узла: ^ «Это означает, что родительский узел находится в первом столбце узла, выше, где находится узел, и узел, ближайший к узлу. Например,« Рисунок 3-5 » ^5^ ”“ ^2^ «а также» ^4^ «, Узел отца есть» v3v ”“ H1H «а также» ^2^ ”
Читайте также:  Function with dictionary python

2 Проблема, которую необходимо учитывать -разветвляет равномерную длину печати узла. Мы должны предусматривать, как долго находится узел при печати.

Представьте, что если значение некоторых узлов сами по себе очень короткое, например, «1» и «2», и длина некоторых узлов, таких как «43323232», «78787237» и т. Д., То, если нет единства. Из единого, длина неизбежно будет происходить при печати длинного и короткого значения бинарного дерева, что вызовет неоднозначность.

В Java значение наиболее целочисленного значения Integer.MIN_VALUE (-2147483648), длина оккупации составляет 11, плюс префикс и суффикс (» H ”“ v «или же» ^ «) После этого длина занятия составляет 13. Чтобы лучше отличаться после печати, добавьте два пространства в переднее и два пространства, а общая длина занятия составляет 17. То есть пространство с длиной 17, неизбежно должно быть возможно. Положите любое 32 -битное целое число, и стиль неплохой одновременно.

На данный момент мы согласились,При печати каждого узла вы должны позволить каждому узлу заняться длиной 17 при печати.Сущность Пример заключается в следующем:

Например, значение узла составляет 8, предположим, этот узел плюс » v «Как фронт без страдания, то существенное содержание — это» v8v «Длина составляет всего 3, когда она напечатана v8v «Передняя часть 7 пространств добавлено, а последний также дополнен 7 пробелами, так что общая длина составляет 17. Другой пример, значение узла — 66. Предположим, этот узел плюс» v «Как фронт без страдания, то существенное содержание — это» v66v «Длина составляет всего 4, когда она напечатана v66v «Передняя часть 6 пробелов добавлена ​​спереди, а последняя из 7 пустых сетей будет добавлено в 17. Короче говоря, если длина недостаточная, передняя и сзади почти равны пространству для составления.

3 Стиль печати определяется, и указаны стандарты занятой длины, и, наконец, объясняется конкретная реализация.

Общий процесс печати объединяется с бинарным деревомСначала правая подзадача, затем корневой узел, последний левый подза Рекурсивный процесс обхода. (Причина, по которой вы решите пересечь последовательность средней, вместо предисловия/пост -заказ, заключается в том, что порядок прохождения среднего порядка -это порядок, согласно которому двоичное дерево «сплющено» напрямую.) Если вы восстановитесь в узле, вы сначала переселили его правый под -три. После того, как правое дерево пройдет, вернитесь в этот узел.

  • Если слой этого узла составляет L, сначала напечатайте пустые сетки L × 17 (без изменения), а затем начните создавать содержимое печати узла. Конечно, это содержимое включает в себя значение узла и определенный символ префикса.
  • Если узел является правильным детским узлом своего отца узла, передний суфмон — «V»
  • Если узел является левым детьми узлом отца, передние страдания «^»
  • Если это головкий узел, передние страдания — «H».
  • Наконец, количество почти последовательных пространств вставлено до и после, а контент печати с длиной 17 завершен. После печати этого контента он изменяется.
  • Наконец, процесс прохождения левого под -трищика выполняется.

См. Метод PrintTree в следующем коде во всех процессах печатных бинарных деревьев.

Код

package chapter_3_binarytreeproblem; public class Problem_03_PrintBinaryTree   public static class Node   public int value; public Node left; public Node right; public Node(int data)   this.value = data; > > public static void printTree(Node head)   System.out.println("Binary Tree:"); printInOrder(head, 0, "H", 17); System.out.println(); > /** * Эквивалент обратного обхода среднего порядка (справа-> средний-> слева) * (Причина, по которой выбирается последовательное обход, вместо последовательности прелюдии/после, потому что порядок обхода среднего порядка -это порядок «перемешивания» двоичного дерева непосредственно, поэтому после 90 ° его именно порядок печати в очереди) */ public static void printInOrder(Node head, int height, String to, int len)   if (head == null)   return; > printInOrder(head.right, height + 1, "v", len); // рекурсивно пересекать правый подза String val = to + head.value + to; // Лечение и печать корневых узлов int lenM = val.length(); int lenL = (len - lenM) / 2; int lenR = len - lenM - lenL; val = getSpace(lenL) + val + getSpace(lenR); System.out.println(getSpace(height * len) + val); printInOrder(head.left, height + 1, "^", len); // рекурсивно пересекание левого подзадачи > public static String getSpace(int num)   String space = " "; StringBuffer buf = new StringBuffer(""); for (int i = 0; i  num; i++)   buf.append(space); > return buf.toString(); > public static void main(String[] args)   Node head = new Node(1); head.left = new Node(-222222222); head.right = new Node(3); head.left.left = new Node(Integer.MIN_VALUE); head.right.left = new Node(55555555); head.right.right = new Node(66); head.left.left.right = new Node(777); printTree(head); head = new Node(1); head.left = new Node(2); head.right = new Node(3); head.left.left = new Node(4); head.right.left = new Node(5); head.right.right = new Node(6); head.left.left.right = new Node(7); printTree(head); head = new Node(1); head.left = new Node(1); head.right = new Node(1); head.left.left = new Node(1); head.right.left = new Node(1); head.right.right = new Node(1); head.left.left.right = new Node(1); printTree(head); > > 
Binary Tree: v66v v3v ^55555555^ H1H ^-222222222^ v777v ^-2147483648^ Binary Tree: v6v v3v ^5^ H1H ^2^ v7v ^4^ Binary Tree: v1v v1v ^1^ H1H ^1^ v1v ^1^ 

Источник

how to print leaf nodes of a binary tree in java

If you want to practice data structure and algorithm programs, you can go through 100+ java coding interview questions.

This is 7th part of java binary tree tutorial.

In this post, we will see about program to print leaf nodes in a binary tree in java

Algorithm-

  • If node is null then return 0
  • If encounterd leaf node(i.e. node.left is null and node.right is null) then print the node.
  • Recursively visit leaf subtree and right subtree.

Code for recursion will be:

Lets create java program for counting number of leaf nodes:

Java Binary tree tutorial:

  • Binary tree in java
  • Binary tree preorder traversal
  • Binary tree postorder traversal
  • Binary tree inorder traversal
  • Binary tree level order traversal
  • Binary tree spiral order traversal
  • Binary tree reverse level order traversal
  • Binary tree boundary traversal
  • Print leaf nodes of binary tree
  • Count leaf nodes in binary tree
  • get maximum element in binary tree
  • Print all paths from root to leaf in binary tree
  • Print vertical sum of binary tree in java
  • Get level of node in binary tree in java
  • Lowest common ancestor(LCA) in binary tree in java

Was this post helpful?

You may also like:

Inorder Successor in a Binary Search Tree

Count subtrees with Sum equal to target in binary tree

Lowest Common Ancestor (LCA) for n-ary Tree

Convert sorted Linked List to balanced BST

Check if a binary tree is binary search tree or not in java

Delete a node from binary search tree in java

Binary search tree in java

Find minimum and maximum elements in binary search tree in java

Share this

Author

Count subtrees with Sum equal to target in binary tree

Table of ContentsProblemSolution If you want to practice data structure and algorithm programs, you can go through 100+ java coding interview questions. In this post, we will see about how to count subtrees with Sum equal to target in binary tree Problem Given a Binary tree and an integer. You need to find the number of […]

Lowest Common Ancestor (LCA) for n-ary Tree

Table of ContentsProblemSolution If you want to practice data structure and algorithm programs, you can go through Java coding interview questions. In this post, we will see about Lowest Common Ancestor for n-ary Tree. Problem Given a n-ary tree also known as a Generic Tree and also two nodes. You need to find the Lowest common […]

Check if a binary tree is binary search tree or not in java

Table of ContentsFirst method:Java program:Second Method:Java program:Complete java program to check if Binary tree is binary search tree or not. If you want to practice data structure and algorithm programs, you can go through 100+ java coding interview questions. In this post, we will see how to check if given binary tree is binary search tree […]

Delete a node from binary search tree in java

Table of ContentsIf node has no childIf node has one childrenIf node has two childrenJava program to delete node in Binary search tree If you want to practice data structure and algorithm programs, you can go through 100+ java coding interview questions. In this post, we will see how to delete a node from binary search […]

Lowest Common Ancestor (LCA) of binary tree in java

Table of ContentsRecursive Algorithm (For nodes A and B):Complete java program:Java Binary tree tutorial: If you want to practice data structure and algorithm programs, you can go through 100+ java coding interview questions. In this post, we will see how to find lowest common ancestor(LCA) of two nodes in binary tree. Lets understand with example. As […]

Boundary traversal of binary tree in java

Table of ContentsPrint left edge nodes (Excluding leaf nodes)Print leaf nodes:Print right edge nodes (From bottom to top) :Java Binary tree tutorial: If you want to practice data structure and algorithm programs, you can go through 100+ java coding interview questions. In this post, we will see boundary traversal of binary tree in java. Lets understand […]

Источник

Оцените статью