欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中實現(xiàn)二叉樹的遍歷與重構

 更新時間:2023年10月19日 10:11:56   作者:Eocc  
這篇文章主要介紹了Java中實現(xiàn)二叉樹的遍歷與重構,樹是一種非線性的數(shù)據(jù)結構,它是由n(n>=0)個有限結點組成一個具有層次關系的集合,把它叫做樹是因為它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的,需要的朋友可以參考下

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?Swagger實現(xiàn)API自動生成單元測試

    Springfox是一個使用Java語言開發(fā)開源的API Doc的框架,它的前身是swagger-springmvc,可以將我們的Controller中的方法以文檔的形式展現(xiàn),這篇文章主要介紹了如何使用Springfox?Swagger實現(xiàn)API自動生成單元測試,感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • java用撲克牌計算24點

    java用撲克牌計算24點

    這篇文章主要為大家詳細介紹了java實現(xiàn)24點撲克牌游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • springboot cloud使用eureka整合分布式事務組件Seata 的方法

    springboot cloud使用eureka整合分布式事務組件Seata 的方法

    這篇文章主要介紹了springboot cloud使用eureka整合分布式事務組件Seata 的方法 ,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-05-05
  • Mybatis-Plus邏輯刪除的用法詳解

    Mybatis-Plus邏輯刪除的用法詳解

    這篇文章主要為大家詳細介紹了Mybatis-Plus 邏輯刪除的用法,文中有詳細的代碼示例,對我們的學習或工作有一定的幫助,需要的朋友可以參考下
    2023-07-07
  • java進行遠程部署與調(diào)試及原理詳解

    java進行遠程部署與調(diào)試及原理詳解

    這篇文章主要介紹了java進行遠程部署與調(diào)試及原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • Java深入淺出說流的使用

    Java深入淺出說流的使用

    這篇文章主要介紹了Java深入淺出說流的使用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • 詳解在spring boot中消息推送系統(tǒng)設計與實現(xiàn)

    詳解在spring boot中消息推送系統(tǒng)設計與實現(xiàn)

    這篇文章主要介紹了詳解在spring boot中消息推送系統(tǒng)設計與實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • spring boot集成shiro詳細教程(小結)

    spring boot集成shiro詳細教程(小結)

    這篇文章主要介紹了spring boot 集成shiro詳細教程,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • ehcache模糊批量移除緩存的方法

    ehcache模糊批量移除緩存的方法

    本篇文章主要介紹了ehcache模糊批量移除緩存的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • SpringCloud Eureka服務的基本配置和操作方法

    SpringCloud 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

最新評論