Java中實(shí)現(xiàn)二叉樹的遍歷與重構(gòu)
Java二叉樹的遍歷與重構(gòu)
- 先序遍歷: 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ù)先序遍歷和中序遍歷重構(gòu)二叉樹
- 先序遍歷的第一個(gè)節(jié)點(diǎn)為根節(jié)點(diǎn)1
- 在中序遍歷中找到根節(jié)點(diǎn)1,其左側(cè)的就是這個(gè)節(jié)點(diǎn)的左子樹的中序遍歷7,2,5,4,右側(cè)的就是右子樹的中序遍歷6,3,8
- 在先序遍歷中找到左右子樹的先序遍歷2,7,4,5,3,6,8
- 遞歸左右子樹重構(gòu)二叉樹(左子樹的先序遍歷的第一個(gè)節(jié)點(diǎn)即為左子樹的根節(jié)點(diǎn)…)
根據(jù)中序遍歷和后序遍歷重構(gòu)二叉樹
與前面差不多,后序遍歷的最后一個(gè)節(jié)點(diǎn)為根節(jié)點(diǎn),然后去中序遍歷中找根節(jié)點(diǎn)的左右子樹。
Tip: 中序遍歷的根節(jié)點(diǎn)在中間,后序遍歷的根節(jié)點(diǎn)在最后,取子樹的遍歷的時(shí)候能用到
如:第一次遞歸中,根節(jié)點(diǎn)1的在中序遍歷中是第5個(gè)節(jié)點(diǎn),那么其左子樹就是左邊4個(gè)(1 ~ 5-1),右子樹為右3個(gè)(5+1 ~ 8);左子樹的后續(xù)遍歷為前4個(gè)(1 ~ 5-1),右子樹為連著的后面的3個(gè)(5~7)。
注意:根據(jù)先序遍歷和后續(xù)遍歷不能重構(gòu)唯一的二叉樹
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ù)先序遍歷和后序遍歷重構(gòu)二叉樹 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ù)遍歷重構(gòu)二叉樹 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); } }
到此這篇關(guān)于Java中實(shí)現(xiàn)二叉樹的遍歷與重構(gòu)的文章就介紹到這了,更多相關(guān)Java二叉樹的遍歷與重構(gòu)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何使用Springfox?Swagger實(shí)現(xiàn)API自動(dòng)生成單元測試
Springfox是一個(gè)使用Java語言開發(fā)開源的API Doc的框架,它的前身是swagger-springmvc,可以將我們的Controller中的方法以文檔的形式展現(xiàn),這篇文章主要介紹了如何使用Springfox?Swagger實(shí)現(xiàn)API自動(dòng)生成單元測試,感興趣的朋友跟隨小編一起看看吧2024-04-04springboot cloud使用eureka整合分布式事務(wù)組件Seata 的方法
這篇文章主要介紹了springboot cloud使用eureka整合分布式事務(wù)組件Seata 的方法 ,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05java進(jìn)行遠(yuǎn)程部署與調(diào)試及原理詳解
這篇文章主要介紹了java進(jìn)行遠(yuǎn)程部署與調(diào)試及原理詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12詳解在spring boot中消息推送系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
這篇文章主要介紹了詳解在spring boot中消息推送系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-05-05spring boot集成shiro詳細(xì)教程(小結(jié))
這篇文章主要介紹了spring boot 集成shiro詳細(xì)教程,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01SpringCloud Eureka服務(wù)的基本配置和操作方法
Eureka是Netflix開源的一個(gè)基于REST的服務(wù)治理框架,主要用于實(shí)現(xiàn)微服務(wù)架構(gòu)中的服務(wù)注冊與發(fā)現(xiàn),Eureka是Netflix開源的服務(wù)發(fā)現(xiàn)框架,用于在分布式系統(tǒng)中實(shí)現(xiàn)服務(wù)的自動(dòng)注冊與發(fā)現(xiàn),本文介紹SpringCloud Eureka服務(wù)的基本配置和操作方法,感興趣的朋友一起看看吧2023-12-12