【算法系列之十三】二叉樹兩葉節點的最大距離

1、題目描述
????給定一棵二叉樹,計算這課二叉樹的直徑長度,即為二叉樹任意兩個節點間的最長路徑。比如:

????????

? ? ?這棵二叉樹的最長路徑為3。

2、解題思路
????使用遞歸進行求解,每次遞歸的過程中,先求出以某個節點為樹根的二叉樹的左子樹的最長深度maxLeft、右子樹的最長深度maxRight,并在遞歸函數中用一個變量maxLen來保存任意兩個節點間的最長路徑。在求出左子樹的最長深度maxLeft和右子樹的最長深度maxRight之后,就可以求出以該節點為根的二叉樹的最長路徑maxLen。具體代碼如下:

public class Solution {static int maxLen = 0;public static void main(String[] args) {TreeNode root = new TreeNode(0);TreeNode p1 = new TreeNode(1);TreeNode p2 = new TreeNode(2);TreeNode p3 = new TreeNode(3);TreeNode p4 = new TreeNode(4);TreeNode p5 = new TreeNode(5);TreeNode p6 = new TreeNode(6);TreeNode p7 = new TreeNode(7);TreeNode p8 = new TreeNode(8);root.left = p1;root.right = p2;p1.left = p3;p3.left = p4;p2.left = p5;p2.right = p6;p6.right = p7;p7.right = p8;FindMaxLen(root);System.out.println(maxLen);}public static void FindMaxLen(TreeNode pRoot) {if (pRoot == null) {// 空的話直接結束return;}if (pRoot.left == null) {// 左子為空,左面最大長度為0pRoot.maxLeft = 0;}if (pRoot.right == null) {// 右子為空,右面最大長度為0pRoot.maxRight = 0;}if (pRoot.left != null) {// 遞歸獲取以左子節點為根節點的最大距離FindMaxLen(pRoot.left);}if (pRoot.right != null) {// 遞歸獲取以右子節點為根節點的最大距離FindMaxLen(pRoot.right);}if (pRoot.left != null) {// 左面最大距離=左子左面最大距離與左子右面最大距離取最大值+1pRoot.maxLeft = Math.max(pRoot.left.maxLeft, pRoot.left.maxRight) + 1;}if (pRoot.right != null) {// 右面最大距離=右子左面最大距離與右子右面最大距離取最大值+1pRoot.maxRight = Math.max(pRoot.right.maxLeft, pRoot.right.maxRight) + 1;}if (pRoot.maxLeft + pRoot.maxRight > maxLen) {// 刷新最大距離maxLen = pRoot.maxLeft + pRoot.maxRight;}}}class TreeNode {TreeNode left;TreeNode right;int maxLeft;int maxRight;int data;public TreeNode(int data) {this.data = data;}
}

3、另一種解法:遞歸

public static int FindMaxLen(TreeNode pRoot) {if (pRoot == null) {return 0;}// 遞歸獲取左子、右子的最大距離int maxLeft = FindMaxLen1(pRoot.left);int maxRight = FindMaxLen1(pRoot.right);// 刷新最大距離maxLen = Math.max(maxLeft + maxRight, maxLen);// 返回該節點的父節點在該側的最大距離return Math.max(maxLeft, maxRight) + 1;
}

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/443279.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443279.shtml
英文地址,請注明出處:http://en.pswp.cn/news/443279.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

date比較大小 mybatis_Hibernate 和 MyBatis 哪個更好用?

Java大聯盟幫助萬千Java學習者持續成長關注作者|SylvanasSun鄭沐興https://zhuanlan.zhihu.com/p/21966051B 站搜索:楠哥教你學Java獲取更多優質視頻教程前言由于編程思想與數據庫的設計模式不同,生出了一些ORM框架。核心都是將關系型數據庫和…

簡單的cpu飆升排查方法

1先來一段飆升代碼 public class FindJavaThreadInTaskManager {public static void main(String[] args) {Thread thread new Thread(new Worker());thread.start();}static class Worker implements Runnable {Overridepublic void run() {while (true) {System.out.printl…

tortoisesvn創建部署項目_FrameWork如何進行云托管部署

介紹CloudBase Framework 是云開發官方出品的云原生一體化部署工具,可以幫助開發者將靜態網站、后端服務和小程序等應用,一鍵部署到云開發 Serverless 架構的云平臺上,自動伸縮且無需關心運維,聚焦應用本身,無需關心底…

【算法系列之十四】最大子序和

1、題目描述 給定一個整數數組 nums ,找到一個具有最大和的連續子數組(子數組最少包含一個元素),返回其最大和。 示例: 輸入: [-2,1,-3,4,-1,2,1,-5,4], 輸出: 6 解釋: 連續子數組 [4,-1,2,1] 的和最大,為 6。 2、…

python的代碼復用技術_Python__函數和代碼復用

主要內容函數的定義和使用實例:七段數碼管的繪制代碼復用與函數遞歸PyInstall庫的使用實例:科赫雪花小包裹函數的定義與使用函數的理解與定義函數的使用及調用過程函數的參數傳遞函數的返回值局部變量和全局變量lambda函數------------------------------------函數…

Queue:poll、offer、element、peek的區別

隊列是一種特殊的線性表,它只允許在表的前端(front)進行刪除操作,而在表的后端(rear)進行插入操作。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。隊列中沒有元素時,稱為空隊…

python實現k均值算法_python實現kMeans算法

聚類是一種無監督的學習,將相似的對象放到同一簇中,有點像是全自動分類,簇內的對象越相似,簇間的對象差別越大,則聚類效果越好。1、k均值聚類算法k均值聚類將數據分為k個簇,每個簇通過其質心,即…

mysql給數據量大的表添加索引的辦法

有一個問題,一張表有3百萬條記錄,隨著時間的增加,記錄量會更多,此時查詢速度很慢。在創建此表前沒有未相應字段添加索引,所以此時需要為表添加索引。但是因為數據量大的原因,索引添加不成功,想了…

修改背景圖片_我花了5小時,為網易修改了一份內容超多的PPT,效果超級贊!!...

微信掃碼觀看全套Excel、Word、PPT視頻作者:宋雪賢 來源:PPT進化論(ID:PPTjinhualun)哈嘍,大家好,不知道您看過《我花了3個小時,為京東修改了一份PPT,效果好到驚人!》這篇案例修改文…

MySQL千萬級別大表如何優化?

當MySQL單表記錄數過大時,增刪改查性能都會急劇下降,可以參考以下步驟來優化: 單表優化 除非單表數據未來會一直不斷上漲,否則不要一開始就考慮拆分,拆分會帶來邏輯、部署、運維的各種復雜度,一般以整型值…

linux c 調用python_C程序調用Python腳本

一般調用步驟Py_Initialize(); //初始化Python環境PyImport_ImportModule("test"); // 載入python模塊PyObject_GetAttrString(g_pModule,"test1"); //獲得相應Python函數的PyObjectPyObject_CallFunction(test1,"i,s",2,e); //調用Python相應的…

命令測試post_【第2088期】前端中臺化,把格局做大——NodeJS 和測試服務探索

前言今日早讀文章由《React狀態管理與同構實戰》作者LucasHC投稿分享。正文從這開始~~近些年,「NodeJS 應該如何在公司業務中真實落地 」這類問題屢見不鮮。自從 2009 年 NodeJS 誕生之后,搶盡風頭,圈粉無數。但一定有工程師不禁要質疑「Node…

Go類型轉換

由于Go語言不存在隱式類型轉換,因此所有的類型轉換都必須顯式的聲明。 string、int、float類型相互轉換 string轉其他 string轉成int: int, err : strconv.Atoi(string) string轉成int64: // 參數1:帶轉換字符串,/…

linux tee 重定向_快樂的linux命令行-重定向

整理自《快樂的linux命令行一書》。linux系統版本: Ubuntu 17.04本章,我們將介紹命令行最酷的特性,叫做I/O重定向,通過這個工具,可以重定向命令的輸入輸出,命令的輸入來自文件,而輸出也存到文。…

Java 診斷工具 Arthas 常見命令

基本概念 云原生這么多微服務,當然需要一個診斷利器來排查問題。 Arthas 是阿里開源的 Java 診斷工具,深受開發者喜愛。在線排查問題,無需重啟;動態跟蹤 Java 代碼;實時監控 JVM 狀態。Arthas 支持 JDK 6&#xff0c…

28和lba48命令格式區別_編譯Sass(命令行)

本文作者:開課吧無憂圖文編輯:開三金sass編譯有很多種方式,如命令行編譯模式、編輯器自動編譯、編譯軟件koala、sass-loader等。今天我們就先來看第一種:命令行編譯剛才我在test文件夾里面已經建立了一個style.scss文件&#xff0…

JAVA基礎編程代碼50個

【程序1】 題目:古典問題:有一對兔子,從出生后第3個月起每個月都生一對兔子,小兔子長到第三個月后每個月又生一對兔子,假如兔子都不死,問每個月的兔子對數為多少? 程序分析: 兔子…

爬蟲軟件python功能_Python 網絡爬蟲程序詳解

#!/usr/bin/python #調用pythonfrom sys import argv #導入sys是導入python解釋器和他環境相關的參數from os import makedirs,unlink,sep  #os主要提供對系統路徑,文件重命名和刪除文件所需的函數#makedirs是創建遞歸文件夾的函數。#比如說我們要創建一個新的目錄…

價錢轉換python_如何在python中轉換貨幣?

我正在做一個虛擬助手項目。我想讓它告訴我其他貨幣的美元匯率。我用beauthoulsoup編寫了以下代碼,它從給定的網站獲取數據,對其進行解析并在命令行中打印結果供我閱讀。但這只是美元對巴基斯坦盧比。如何修改程序,使其接受任何貨幣并告訴我該…

char qt 轉unicode_Qt QString 中文 char* UTF-8 QByteArray QTextCodec unicode gb2312 GBK 亂碼與轉碼問題...

2012-03-22 14:00175人閱讀評論(0)代碼如下:如果不不設全局的字符集是utf-8,那么網上一般的方法是可以轉的。如下程序中 #define DD 1的情況下;但是如果設置了全局的utf-8,再用以前的方法:QByteArraybaaaa.toLatin1();…