Java中實現(xiàn)二叉樹的遍歷與重構
Java二叉樹的遍歷與重構
- 先序遍歷: 1,2,7,4,5,3,6,8
- 中序遍歷:7,2,5,4,1,6,3,8
- 后序遍歷:7,5,4,2,6,8,3,1
根據(jù)先序遍歷和中序遍歷重構二叉樹
- 先序遍歷的第一個節(jié)點為根節(jié)點1
- 在中序遍歷中找到根節(jié)點1,其左側的就是這個節(jié)點的左子樹的中序遍歷7,2,5,4,右側的就是右子樹的中序遍歷6,3,8
- 在先序遍歷中找到左右子樹的先序遍歷2,7,4,5,3,6,8
- 遞歸左右子樹重構二叉樹(左子樹的先序遍歷的第一個節(jié)點即為左子樹的根節(jié)點…)
根據(jù)中序遍歷和后序遍歷重構二叉樹
與前面差不多,后序遍歷的最后一個節(jié)點為根節(jié)點,然后去中序遍歷中找根節(jié)點的左右子樹。
Tip: 中序遍歷的根節(jié)點在中間,后序遍歷的根節(jié)點在最后,取子樹的遍歷的時候能用到
如:第一次遞歸中,根節(jié)點1的在中序遍歷中是第5個節(jié)點,那么其左子樹就是左邊4個(1 ~ 5-1),右子樹為右3個(5+1 ~ 8);左子樹的后續(xù)遍歷為前4個(1 ~ 5-1),右子樹為連著的后面的3個(5~7)。
注意:根據(jù)先序遍歷和后續(xù)遍歷不能重構唯一的二叉樹
package utils; import java.util.Arrays; class Node { int val; Node left; Node right; public Node() {} public Node(int val) { this.val = val; } } public class BinaryTree { // 先序遍歷 根-左-右 private static void firstOrder(Node root) { if (root ==null)return; System.out.print(root.val); firstOrder(root.left); firstOrder(root.right); } // 中序遍歷 左-根-右 private static void inOrder(Node root) { if (root ==null)return; inOrder(root.left); System.out.print(root.val); inOrder(root.right); } // 后序遍歷 左-右-根 private static void lastOrder(Node root) { if (root ==null)return; lastOrder(root.left); lastOrder(root.right); System.out.print(root.val); } // 根據(jù)先序遍歷和后序遍歷重構二叉樹 private static Node reConstructBinaryTree(int[] preOrder, int[] inOrder) { if (preOrder.length == 0 || inOrder.length == 0) { return null; } int len = preOrder.length; Node node = new Node(preOrder[0]); for (int i=0; i<len; i++) { if (preOrder[0] == inOrder[i]) { node.left = reConstructBinaryTree( Arrays.copyOfRange(preOrder, 1, i+1), Arrays.copyOfRange(inOrder, 0, i) ); node.right = reConstructBinaryTree( Arrays.copyOfRange(preOrder, i+1, len), Arrays.copyOfRange(inOrder, i+1, len) ); } } return node; } // 根據(jù)中序遍歷和后續(xù)遍歷重構二叉樹 private static Node reConstructBinaryTree2(int[] inOrder, int[] lastOrder) { if (lastOrder.length == 0 || inOrder.length == 0) { return null; } int len = lastOrder.length; Node node = new Node(lastOrder[len-1]); for (int i=0; i<len; i++) { if (lastOrder[len-1] == inOrder[i]) { node.left = reConstructBinaryTree2( Arrays.copyOfRange(inOrder, 0, i), Arrays.copyOfRange(lastOrder, 0, i) ); node.right = reConstructBinaryTree2( Arrays.copyOfRange(inOrder, i+1, inOrder.length), Arrays.copyOfRange(lastOrder, i, lastOrder.length-1) ); } } return node; } public static void main(String[] args) { int[] preOrder = {1,2,7,4,5,3,6,8}; int[] inOrder = {7,2,5,4,1,6,3,8}; int[] lastOrder = {7,5,4,2,6,8,3,1}; Node root = reConstructBinaryTree(preOrder, inOrder); lastOrder(root); System.out.println(); root = reConstructBinaryTree2(inOrder, lastOrder); firstOrder(root); } }
到此這篇關于Java中實現(xiàn)二叉樹的遍歷與重構的文章就介紹到這了,更多相關Java二叉樹的遍歷與重構內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
如何使用Springfox?Swagger實現(xiàn)API自動生成單元測試
Springfox是一個使用Java語言開發(fā)開源的API Doc的框架,它的前身是swagger-springmvc,可以將我們的Controller中的方法以文檔的形式展現(xiàn),這篇文章主要介紹了如何使用Springfox?Swagger實現(xiàn)API自動生成單元測試,感興趣的朋友跟隨小編一起看看吧2024-04-04springboot cloud使用eureka整合分布式事務組件Seata 的方法
這篇文章主要介紹了springboot cloud使用eureka整合分布式事務組件Seata 的方法 ,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-05-05詳解在spring boot中消息推送系統(tǒng)設計與實現(xiàn)
這篇文章主要介紹了詳解在spring boot中消息推送系統(tǒng)設計與實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05SpringCloud Eureka服務的基本配置和操作方法
Eureka是Netflix開源的一個基于REST的服務治理框架,主要用于實現(xiàn)微服務架構中的服務注冊與發(fā)現(xiàn),Eureka是Netflix開源的服務發(fā)現(xiàn)框架,用于在分布式系統(tǒng)中實現(xiàn)服務的自動注冊與發(fā)現(xiàn),本文介紹SpringCloud Eureka服務的基本配置和操作方法,感興趣的朋友一起看看吧2023-12-12