日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

集群节点数和分片数关系_完全二叉树的节点数,你真的会算吗?

發(fā)布時(shí)間:2024/1/23 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 集群节点数和分片数关系_完全二叉树的节点数,你真的会算吗? 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

讀完本文,你可以去力扣拿下如下題目:

222.完全二叉樹(shù)的節(jié)點(diǎn)個(gè)數(shù)

-----------

如果讓你數(shù)一下一棵普通二叉樹(shù)有多少個(gè)節(jié)點(diǎn),這很簡(jiǎn)單,只要在二叉樹(shù)的遍歷框架上加一點(diǎn)代碼就行了。

但是,如果給你一棵完全二叉樹(shù),讓你計(jì)算它的節(jié)點(diǎn)個(gè)數(shù),你會(huì)不會(huì)?算法的時(shí)間復(fù)雜度是多少?這個(gè)算法的時(shí)間復(fù)雜度應(yīng)該是 O(logN*logN),如果你心中的算法沒(méi)有達(dá)到高效,那么本文就是給你寫的。

首先要明確一下兩個(gè)關(guān)于二叉樹(shù)的名詞「完全二叉樹(shù)」和「滿二叉樹(shù)」。

我們說(shuō)的完全二叉樹(shù)如下圖,每一層都是緊湊靠左排列的:

我們說(shuō)的滿二叉樹(shù)如下圖,是一種特殊的完全二叉樹(shù),每層都是是滿的,像一個(gè)穩(wěn)定的三角形:

說(shuō)句題外話,關(guān)于這兩個(gè)定義,中文語(yǔ)境和英文語(yǔ)境似乎有點(diǎn)區(qū)別,我們說(shuō)的完全二叉樹(shù)對(duì)應(yīng)英文 Complete Binary Tree,沒(méi)有問(wèn)題。但是我們說(shuō)的滿二叉樹(shù)對(duì)應(yīng)英文 Perfect Binary Tree,而英文中的 Full Binary Tree 是指一棵二叉樹(shù)的所有節(jié)點(diǎn)要么沒(méi)有孩子節(jié)點(diǎn),要么有兩個(gè)孩子節(jié)點(diǎn)。如下:

以上定義出自 wikipedia,這里就是順便一提,其實(shí)名詞叫什么都無(wú)所謂,重要的是算法操作。本文就按我們中文的語(yǔ)境,記住「滿二叉樹(shù)」和「完全二叉樹(shù)」的區(qū)別,等會(huì)會(huì)用到。

一、思路分析

現(xiàn)在回歸正題,如何求一棵完全二叉樹(shù)的節(jié)點(diǎn)個(gè)數(shù)呢?

// 輸入一棵完全二叉樹(shù),返回節(jié)點(diǎn)總數(shù) int countNodes(TreeNode root);

如果是一個(gè)普通二叉樹(shù),顯然只要向下面這樣遍歷一邊即可,時(shí)間復(fù)雜度 O(N):

public int countNodes(TreeNode root) {if (root == null) return 0;return 1 + countNodes(root.left) + countNodes(root.right); }

那如果是一棵滿二叉樹(shù),節(jié)點(diǎn)總數(shù)就和樹(shù)的高度呈指數(shù)關(guān)系:

public int countNodes(TreeNode root) {int h = 0;// 計(jì)算樹(shù)的高度while (root != null) {root = root.left;h++;}// 節(jié)點(diǎn)總數(shù)就是 2^h - 1return (int)Math.pow(2, h) - 1; }

完全二叉樹(shù)比普通二叉樹(shù)特殊,但又沒(méi)有滿二叉樹(shù)那么特殊,計(jì)算它的節(jié)點(diǎn)總數(shù),可以說(shuō)是普通二叉樹(shù)和完全二叉樹(shù)的結(jié)合版,先看代碼:

public int countNodes(TreeNode root) {TreeNode l = root, r = root;// 記錄左、右子樹(shù)的高度int hl = 0, hr = 0;while (l != null) {l = l.left;hl++;}while (r != null) {r = r.right;hr++;}// 如果左右子樹(shù)的高度相同,則是一棵滿二叉樹(shù)if (hl == hr) {return (int)Math.pow(2, hl) - 1;}// 如果左右高度不同,則按照普通二叉樹(shù)的邏輯計(jì)算return 1 + countNodes(root.left) + countNodes(root.right); }

結(jié)合剛才針對(duì)滿二叉樹(shù)和普通二叉樹(shù)的算法,上面這段代碼應(yīng)該不難理解,就是一個(gè)結(jié)合版,但是其中降低時(shí)間復(fù)雜度的技巧是非常微妙的。

PS:我認(rèn)真寫了 100 多篇原創(chuàng),手把手刷 200 道力扣題目,全部發(fā)布在labuladong的算法小抄,持續(xù)更新。建議收藏,按照我的文章順序刷題,掌握各種算法套路后投再入題海就如魚得水了。

二、復(fù)雜度分析

開(kāi)頭說(shuō)了,這個(gè)算法的時(shí)間復(fù)雜度是 O(logN*logN),這是怎么算出來(lái)的呢?

直覺(jué)感覺(jué)好像最壞情況下是 O(N*logN) 吧,因?yàn)橹暗?while 需要 logN 的時(shí)間,最后要 O(N) 的時(shí)間向左右子樹(shù)遞歸:

return 1 + countNodes(root.left) + countNodes(root.right);

關(guān)鍵點(diǎn)在于,這兩個(gè)遞歸只有一個(gè)會(huì)真的遞歸下去,另一個(gè)一定會(huì)觸發(fā) hl == hr 而立即返回,不會(huì)遞歸下去。

為什么呢?原因如下:

一棵完全二叉樹(shù)的兩棵子樹(shù),至少有一棵是滿二叉樹(shù):

看圖就明顯了吧,由于完全二叉樹(shù)的性質(zhì),其子樹(shù)一定有一棵是滿的,所以一定會(huì)觸發(fā) hl == hr,只消耗 O(logN) 的復(fù)雜度而不會(huì)繼續(xù)遞歸。

綜上,算法的遞歸深度就是樹(shù)的高度 O(logN),每次遞歸所花費(fèi)的時(shí)間就是 while 循環(huán),需要 O(logN),所以總體的時(shí)間復(fù)雜度是 O(logN*logN)。

所以說(shuō),「完全二叉樹(shù)」這個(gè)概念還是有它存在的原因的,不僅適用于數(shù)組實(shí)現(xiàn)二叉堆,而且連計(jì)算節(jié)點(diǎn)總數(shù)這種看起來(lái)簡(jiǎn)單的操作都有高效的算法實(shí)現(xiàn)。

_____________

我的 在線電子書 有 100 篇原創(chuàng)文章,手把手帶刷 200 道力扣題目,建議收藏!對(duì)應(yīng)的 GitHub 算法倉(cāng)庫(kù) 已經(jīng)獲得了 70k star,歡迎標(biāo)星!

總結(jié)

以上是生活随笔為你收集整理的集群节点数和分片数关系_完全二叉树的节点数,你真的会算吗?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。