最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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)二叉樹

  • 先序遍歷的第一個節(jié)點為根節(jié)點1
  • 在中序遍歷中找到根節(jié)點1,其左側(cè)的就是這個節(jié)點的左子樹的中序遍歷7,2,5,4,右側(cè)的就是右子樹的中序遍歷6,3,8
  • 在先序遍歷中找到左右子樹的先序遍歷2,7,4,5,3,6,8
  • 遞歸左右子樹重構(gòu)二叉樹(左子樹的先序遍歷的第一個節(jié)點即為左子樹的根節(jié)點…)

根據(jù)中序遍歷和后序遍歷重構(gòu)二叉樹

與前面差不多,后序遍歷的最后一個節(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ù)遍歷不能重構(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中實現(xiàn)二叉樹的遍歷與重構(gòu)的文章就介紹到這了,更多相關(guān)Java二叉樹的遍歷與重構(gòu)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java多線程4種拒絕策略小結(jié)

    Java多線程4種拒絕策略小結(jié)

    當線程池中的任務(wù)隊列已滿且無法再接受新的任務(wù)時,就需要采取拒絕策略來處理這種情況,本文主要介紹了Java多線程拒絕策略,包含了四種常見的拒絕策略,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • 教你怎么使用Java實現(xiàn)WebSocket

    教你怎么使用Java實現(xiàn)WebSocket

    這篇文章主要介紹了教你怎么使用Java WebSocket,文中有非常詳細的代碼示例,對正在學習java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-05-05
  • OpenCV在Java中的完整集成指南分享

    OpenCV在Java中的完整集成指南分享

    本文詳解了在Java中集成OpenCV的方法,涵蓋jar包導入、dll配置、JNI路徑設(shè)置及跨平臺兼容性處理,提供了圖像處理、特征檢測、實時視頻分析等應(yīng)用實例,并強調(diào)性能優(yōu)化與安全措施,助力開發(fā)者高效實現(xiàn)計算機視覺功能
    2025-07-07
  • 解決Spring Boot 在localhost域奇怪的404問題(Mac book pro)

    解決Spring Boot 在localhost域奇怪的404問題(Mac book pro)

    這篇文章主要介紹了解決Spring Boot 在localhost域奇怪的404問題(Mac book pro),需要的朋友可以參考下
    2017-09-09
  • java打印指定年月份的日歷

    java打印指定年月份的日歷

    這篇文章主要為大家詳細介紹了java打印指定年、指定月份的日歷,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Java使用aspose實現(xiàn)pdf轉(zhuǎn)word

    Java使用aspose實現(xiàn)pdf轉(zhuǎn)word

    Aspose是一套強大的文檔處理工具,被超過80%的財富100強公司信賴,用于在應(yīng)用程序中創(chuàng)建、編輯、導出和轉(zhuǎn)換100多種文件格式,本文將給大家介紹Java使用aspose實現(xiàn)pdf轉(zhuǎn)word的操作方法,需要的朋友可以參考下
    2025-02-02
  • 關(guān)于scanner.nextInt()等next()和scanner.nextIine()連用注意事項

    關(guān)于scanner.nextInt()等next()和scanner.nextIine()連用注意事項

    這篇文章主要介紹了關(guān)于scanner.nextInt()等next()和scanner.nextIine()連用注意事項,具有很好的參考價值,希望對大家有所幫助。
    2023-04-04
  • Spring實現(xiàn)默認標簽解析流程

    Spring實現(xiàn)默認標簽解析流程

    這篇文章主要為大家詳細介紹了Spring實現(xiàn)默認標簽解析流程,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Java利用條件運算符的嵌套來完成學習成績的劃分

    Java利用條件運算符的嵌套來完成學習成績的劃分

    這篇文章主要介紹了Java利用條件運算符的嵌套來完成學習成績的劃分,需要的朋友可以參考下
    2017-02-02
  • dubbo服務(wù)鏈路跟蹤方式

    dubbo服務(wù)鏈路跟蹤方式

    這篇文章主要介紹了dubbo服務(wù)鏈路跟蹤方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07

最新評論

绍兴县| 泸溪县| 陇川县| 连平县| 大田县| 读书| 洪雅县| 台州市| 屯留县| 手游| 寿宁县| 武乡县| 姚安县| 拉萨市| 安陆市| 江北区| 宜春市| 花莲县| 远安县| 电白县| 六盘水市| 永德县| 凤翔县| 安陆市| 静宁县| 三亚市| 巢湖市| 晋城| 枣庄市| 辽宁省| 浙江省| 双桥区| 石棉县| 嘉兴市| 高青县| 若尔盖县| 监利县| 湖南省| 如皋市| 加查县| 黎川县|