Heim Java javaLernprogramm Stellen Sie den Binärbaum durch die Sequenz nach der Durchquerung vor der Bestellung und der Durchquerung in der Reihenfolge wieder her

Stellen Sie den Binärbaum durch die Sequenz nach der Durchquerung vor der Bestellung und der Durchquerung in der Reihenfolge wieder her

Jun 23, 2017 pm 03:36 PM
序列 passieren 遍历

Wenn wir eine

Vorbestellungs-Durchlaufsequenz haben: 1,3,7,9,5,11

In-Reihenfolge-Durchlaufsequenz: 9,7,3,1, 5, 11

Wir können den entsprechenden Binärbaum leicht mit einem Stift schreiben. Aber wie implementiert man es mithilfe von Code?

Lassen Sie uns kurz über die Grundideen sprechen.

Zuerst basiert die Reihenfolge der Vorbestellungsdurchquerung auf der Reihenfolge Wurzel-linkes Kind-rechtes Kind, dann können wir als Erstes bestätigen ist die Durchlaufsequenz vor der Bestellung. Die erste Zahl ist der Wurzelknoten, und dann wird der Durchlauf in der Reihenfolge in der Reihenfolge linkes Kind-Wurzel-rechtes Kind durchlaufen. Wir haben den Wurzelknoten durch die Durchquerung vor der Bestellung bestätigt, dann müssen wir nur noch die Position des Wurzelknotens bei der Durchquerung in der Reihenfolge finden, und dann können wir leicht die Knoten unterscheiden, die zum linken Teilbaum gehören, und diejenigen, die dazu gehören rechter Teilbaum. Wie unten gezeigt:

Wir bestimmen die Nummer 1 als Wurzelknoten und bestimmen sie dann gemäß der Durchlaufreihenfolge der Durchlaufreihenfolge in der Reihenfolge Nummer 1 sind linke Teilbaumknoten und alle rechten Teilbäume sind rechte Teilbäume. Aus der Anzahl der Knoten des linken Teilbaums kann geschlossen werden, dass die drei aufeinanderfolgenden Zahlen vom Wurzelknoten in der Durchlaufsequenz vor der Bestellung zum linken Teilbaum gehören und die verbleibenden Zahlen zum rechten Teilbaum gehören. Auf diese Weise werden die obigen Schritte in der Reihenfolge des linken und rechten Teilbaums wiederholt, bis schließlich keine Kindknoten mehr gefunden werden.

Der Implementierungscode lautet wie folgt:

  1 package com.tree.traverse;  2   3 import java.util.ArrayList;  4 import java.util.List;  5   6 /**  7  * @author Caijh  8  *  9  * 2017年6月2日 下午7:21:10 10  */ 11  12 public class BuildTreePreOrderInOrder { 13  14     /**  15      *              1 
 16      *             / \ 17      *            3   5 
 18      *           /     \ 19      *          7       11 20      *       /  
 21      *      9       
 22      */   23     public static int treeNode = 0;//记录先序遍历节点的个数 24     private List<Node> nodeList = new ArrayList<>();//层次遍历节点的队列 25     public static void main(String[] args) { 26         BuildTreePreOrderInOrder build = new BuildTreePreOrderInOrder(); 27         int[] preOrder = { 1, 3, 7, 9, 5, 11}; 28         int[] inOrder = { 9, 7, 3, 1, 5, 11}; 29          30         treeNode = preOrder.length;//初始化二叉树的节点数 31         Node root = build.buildTreePreOrderInOrder(preOrder, 0, preOrder.length - 1, inOrder, 0, preOrder.length - 1); 32         System.out.print("先序遍历:"); 33         build.preOrder(root); 34         System.out.print("\n中序遍历:"); 35         build.inOrder(root); 36         System.out.print("\n原二叉树:\n"); 37         build.prototypeTree(root); 38     } 39  40     /** 41      * 分治法 42      * 通过先序遍历结果和中序遍历结果还原二叉树 43      * @param preOrder    先序遍历结果序列 44      * @param preOrderBegin     先序遍历起始位置下标 45      * @param preOrderEnd    先序遍历末尾位置下标 46      * @param inOrder    中序遍历结果序列 47      * @param inOrderBegin    中序遍历起始位置下标 48      * @param inOrderEnd     中序遍历末尾位置下标 49      * @return 50      */ 51     public Node buildTreePreOrderInOrder(int[] preOrder, int preOrderBegin, int preOrderEnd, int[] inOrder, int inOrderBegin, int inOrderEnd) { 52         if (preOrderBegin > preOrderEnd || inOrderBegin > inOrderEnd) { 53             return null; 54         } 55         int rootData = preOrder[preOrderBegin];//先序遍历的第一个字符为当前序列根节点 56         Node head = new Node(rootData); 57         int divider = findIndexInArray(inOrder, rootData, inOrderBegin, inOrderEnd);//找打中序遍历结果集中根节点的位置 58         int offSet = divider - inOrderBegin - 1;//计算左子树共有几个节点,节点数减一,为数组偏移量 59         Node left = buildTreePreOrderInOrder(preOrder, preOrderBegin + 1, preOrderBegin + 1 + offSet, inOrder, inOrderBegin,inOrderBegin + offSet); 60         Node right = buildTreePreOrderInOrder(preOrder, preOrderBegin + offSet + 2, preOrderEnd, inOrder, divider + 1, inOrderEnd); 61         head.left = left; 62         head.right = right; 63         return head; 64     } 65     /** 66      * 通过先序遍历找到的rootData根节点,在中序遍历结果中区分出:中左子树和右子树 67      * @param inOrder    中序遍历的结果数组 68      * @param rootData    根节点位置 69      * @param begin    中序遍历结果数组起始位置下标 70      * @param end    中序遍历结果数组末尾位置下标 71      * @return return中序遍历结果数组中根节点的位置 72      */ 73     public int findIndexInArray(int[] inOrder, int rootData, int begin, int end) { 74         for (int i = begin; i <= end; i++) { 75             if (inOrder[i] == rootData) 76                 return i; 77         } 78         return -1; 79     } 80     /** 81      * 二叉树先序遍历结果 82      * @param n 83      */ 84     public void preOrder(Node n) { 85         if (n != null) { 86             System.out.print(n.val + ","); 87             preOrder(n.left); 88             preOrder(n.right); 89         } 90     } 91     /** 92      * 二叉树中序遍历结果 93      * @param n 94      */ 95     public void inOrder(Node n) { 96         if (n != null) { 97             inOrder(n.left); 98             System.out.print(n.val + ","); 99             inOrder(n.right);100         }101     }102     /**103      * 还原后的二叉树104      * 二叉数层次遍历105      * 基本思想:106      *     1.因为推导出来的二叉树是保存在Node类对象的子对象里面的,(类似于c语言的结构体)如果通过递归实现层次遍历的话,不容易实现107      *     2.这里采用List队列逐层保存Node对象节点的方式实现对二叉树的层次遍历输出108      *     3.如果父节点的位置为i,那么子节点的位置为,2i 和 2i+1;依据这个规律逐层遍历,通过保存的父节点,找到子节点。并保存,不断向下遍历保存。109      * @param tree110      */111     public void prototypeTree(Node tree){112         //用list存储层次遍历的节点113         if(tree !=null){114             if(tree!=null)115                 nodeList.add(tree);116             nodeList.add(tree.left);117             nodeList.add(tree.right);118             int count=3;119             //从第三层开始120             for(int i=3;count<treeNode;i++){121                 //第i层第一个子节点的父节点的位置下标122                 int index = (int) Math.pow(2, i-1-1)-1;123                 /**124                  * 二叉树的每一层节点数遍历125                  * 因为第i层的最大节点数为2的i-1次方个,126                  */127                 for(int j=1;j<=Math.pow(2, i-1);){128                     //计算有效的节点的个数,和遍历序列的总数做比较,作为判断循环结束的标志129                     if(nodeList.get(index).left!=null)130                         count++;131                     if(nodeList.get(index).right!=null)132                         count++;133                     nodeList.add(nodeList.get(index).left);134                     nodeList.add(nodeList.get(index).right);135                     index++;136                     if(count>=treeNode)//当所有有效节点都遍历到了就结束遍历137                         break;138                     j+=2;//每次存储两个子节点,所以每次加2139                 }140             }141             int flag=0,floor=1;142             for(Node node:nodeList){143                 if(node!=null)144                     System.out.print(node.val+" ");145                 else146                     System.out.print("# ");//#号表示空节点147                 flag++;148                 /**149                  * 逐层遍历输出二叉树150                  * 
151                  */152                 if(flag>=Math.pow(2, floor-1)){153                     flag=0;154                     floor++;155                     System.out.println();156                 }157             }158         }159     }160     /**161      * 内部类162      * 1.每个Node类对象为一个节点,163      * 2.每个节点包含根节点,左子节点和右子节点164      */165     class Node {166         Node left;167         Node right;168         int val;169         public Node(int val) {170             this.val = val;171         }172     }173 }
Nach dem Login kopieren

Laufergebnis:

Abschließend die Grundidee der schichtweisen Ausgabe des Binärbaums:
* 1. Weil der abgeleitete Binärbaum im Unterobjekt des Node-Klassenobjekts gespeichert ist , (ähnlich der Struktur der C-Sprache) wenn Es ist nicht einfach, hierarchische Durchquerung durch Rekursion zu implementieren
* 2. Hier wird die Listenwarteschlange verwendet, um Knotenobjektknoten Schicht für Schicht zu speichern und die hierarchische Durchquerungsausgabe zu realisieren der Binärbaum
* 3. Wenn die Position des übergeordneten Knotens i ist, dann sind die Positionen der untergeordneten Knoten 2i und 2i+1. Durchlaufen Sie Schicht für Schicht und finden Sie die untergeordneten Knoten durch die gespeicherten übergeordneter Knoten. Und zum Speichern gehen Sie weiter nach unten, um zu speichern.

Das obige ist der detaillierte Inhalt vonStellen Sie den Binärbaum durch die Sequenz nach der Durchquerung vor der Bestellung und der Durchquerung in der Reihenfolge wieder her. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Java, wie man einen Ordner durchläuft und alle Dateinamen abruft Java, wie man einen Ordner durchläuft und alle Dateinamen abruft Mar 29, 2024 pm 01:24 PM

Java ist eine beliebte Programmiersprache mit leistungsstarken Funktionen zur Dateiverarbeitung. In Java ist das Durchsuchen eines Ordners und das Abrufen aller Dateinamen ein üblicher Vorgang, der uns dabei helfen kann, Dateien in einem bestimmten Verzeichnis schnell zu finden und zu verarbeiten. In diesem Artikel wird erläutert, wie eine Methode zum Durchlaufen eines Ordners und zum Abrufen aller Dateinamen in Java implementiert wird, und es werden spezifische Codebeispiele bereitgestellt. 1. Verwenden Sie die rekursive Methode, um den Ordner zu durchlaufen. Die rekursive Methode ist eine Möglichkeit, sich selbst aufzurufen und den Ordner effektiv zu durchlaufen.

Beispiel für die Verwendung der PHP-glob()-Funktion: Alle Dateien in einem angegebenen Ordner durchsuchen Beispiel für die Verwendung der PHP-glob()-Funktion: Alle Dateien in einem angegebenen Ordner durchsuchen Jun 27, 2023 am 09:16 AM

Beispiel für die Verwendung der PHPglob()-Funktion: Alle Dateien in einem bestimmten Ordner durchsuchen Bei der PHP-Entwicklung ist es häufig erforderlich, alle Dateien in einem bestimmten Ordner zu durchsuchen, um einen Stapelvorgang oder das Lesen von Dateien zu implementieren. Um diese Anforderung zu erfüllen, wird die glob()-Funktion von PHP verwendet. Die Funktion glob() kann die Pfadinformationen aller Dateien im angegebenen Ordner abrufen, die die Bedingungen erfüllen, indem sie ein Platzhalter-Übereinstimmungsmuster angibt. In diesem Artikel zeigen wir, wie Sie mit der Funktion glob() alle Dateien in einem bestimmten Ordner durchlaufen

Eingehender Vergleich von Java Iterator und Iterable: Vor- und Nachteile-Analyse Eingehender Vergleich von Java Iterator und Iterable: Vor- und Nachteile-Analyse Feb 19, 2024 pm 04:20 PM

Konzeptionelle Unterschiede: Iterator: Iterator ist eine Schnittstelle, die einen Iterator darstellt, der Werte aus einer Sammlung erhält. Es bietet Methoden wie MoveNext(), Current() und Reset(), mit denen Sie die Elemente in der Sammlung durchlaufen und das aktuelle Element bearbeiten können. Iterable: Iterable ist ebenfalls eine Schnittstelle, die ein iterierbares Objekt darstellt. Es stellt die Methode Iterator() bereit, die ein Iterator-Objekt zurückgibt, um das Durchlaufen der Elemente in der Sammlung zu erleichtern. Verwendung: Iterator: Um Iterator zu verwenden, müssen Sie zuerst ein Iterator-Objekt abrufen und dann die Methode MoveNext() aufrufen, um zum nächsten zu wechseln

So verwenden Sie das OS-Modul zum Durchsuchen von Dateien in einem Verzeichnis in Python 3.x So verwenden Sie das OS-Modul zum Durchsuchen von Dateien in einem Verzeichnis in Python 3.x Jul 29, 2023 pm 02:57 PM

So verwenden Sie das Betriebssystemmodul zum Durchlaufen von Dateien in einem Verzeichnis in Python3.x. In Python können wir das Betriebssystemmodul zum Bearbeiten von Dateien und Verzeichnissen verwenden. Das OS-Modul ist ein wichtiges Modul in der Python-Standardbibliothek und bietet viele betriebssystembezogene Funktionen. In diesem Artikel erklären wir, wie Sie mit dem OS-Modul alle Dateien in einem Verzeichnis durchlaufen. Zuerst müssen wir das OS-Modul importieren: importos Als nächstes können wir die Funktion os.walk() verwenden, um das Verzeichnis zu durchsuchen.

Rekursives Einfügen und Durchlaufen verknüpfter Listen in C++ Rekursives Einfügen und Durchlaufen verknüpfter Listen in C++ Sep 10, 2023 am 09:21 AM

Wir erhalten die ganzzahligen Werte, die zur Bildung der verknüpften Liste verwendet werden. Die Aufgabe besteht darin, zuerst die einfach verknüpfte Liste einzufügen und sie dann mithilfe der rekursiven Methode zu durchlaufen. Knoten am Ende rekursiv hinzufügen, wenn Kopf NULL ist → Knoten zum Kopf hinzufügen, andernfalls zum Kopf hinzufügen (Kopf → Weiter) Knoten rekursiv durchlaufen, wenn Kopf NULL ist → beenden, andernfalls drucken (Kopf → Weiter) Beispieleingabe −1-2-7-9 -10 Ausgabe Ausgabestark>− verknüpfte Liste: 1→2→7→9→10→NULL Eingabe−12-21-17-94-18 Ausgabe− verknüpfte Liste: 12→21→17→94→18→NULL verwendet in folgendes Programm Die Methode ist wie folgt: In dieser Methode verwenden wir die Funktion, um Knoten hinzuzufügen und die einfach verknüpfte Liste zu durchlaufen und zu übergeben

Pythons Funktion „range()': Generieren Sie eine Folge von Zahlen Pythons Funktion „range()': Generieren Sie eine Folge von Zahlen Nov 18, 2023 am 11:51 AM

Pythons Funktion „range()“: Erzeugt eine Zahlenfolge, erfordert spezifische Codebeispiele. Python ist eine leistungsstarke Programmiersprache und verfügt über viele integrierte Funktionen, die beim Schreiben von Programmen sehr hilfreich sind. Eine davon ist die Funktion range(), mit der eine Zahlenfolge generiert wird. In diesem Artikel wird die Verwendung der Funktion „range()“ ausführlich vorgestellt und anhand spezifischer Codebeispiele veranschaulicht. Die grundlegende Syntax der Funktion range() lautet wie folgt: range(start,stop,step) where, s

Java Iterator und Iterable: Die Geheimnisse des Java Collection Traversal lüften Java Iterator und Iterable: Die Geheimnisse des Java Collection Traversal lüften Feb 19, 2024 pm 11:50 PM

Iterator-Schnittstelle Die Iterator-Schnittstelle ist eine im Java-Sammlungsframework definierte Schnittstelle. Sie stellt eine Reihe von Methoden zum Durchlaufen von Sammlungselementen bereit. Die Iterator-Schnittstelle definiert die folgenden Hauptmethoden: hasNext(): Gibt einen booleschen Wert zurück, der angibt, ob das nächste Element vorhanden ist. next(): Gibt das nächste Element zurück. Wenn es kein nächstes Element gibt, wird eine NoSuchElementException geworfen. Remove(): Löscht das Element, auf das aktuell verwiesen wird. Im Folgenden finden Sie Beispielcode zum Durchlaufen einer Sammlung mithilfe der Iterator-Schnittstelle: Listlist=newArrayList();list

Java Iterator und Iterable: Der Schlüssel zum Durchlaufen von Sammlungen, entmystifiziert Java Iterator und Iterable: Der Schlüssel zum Durchlaufen von Sammlungen, entmystifiziert Feb 20, 2024 am 10:27 AM

Einführung in IteratorIterator ist eine Schnittstelle in Java zum Durchlaufen von Sammlungen. Es bietet eine Reihe von Methoden, mit denen Sie sequentiell auf Elemente in einer Sammlung zugreifen können. Mit Iterator können Sie Sammlungstypen wie List, Set und Map durchlaufen. Democode: Listlist=newArrayList();list.add("one");list.add("two");list.add(" three");Iteratoriterator=list.iterator();while(iter

See all articles