二叉查找樹概念與相關(guān)leetcode題目

概念

二叉查找樹,也叫二叉搜索樹锯仪。樹中任意一個(gè)節(jié)點(diǎn)泵督,該節(jié)點(diǎn)的左子樹中每個(gè)節(jié)點(diǎn)的值,都小于該節(jié)點(diǎn)的值庶喜;右子樹中每個(gè)節(jié)點(diǎn)的值小腊,都大于該節(jié)點(diǎn)的值。

查找

從根節(jié)點(diǎn)開始查找久窟,若查找的數(shù)據(jù)等于根節(jié)點(diǎn)的值秩冈,則返回;若查找的數(shù)據(jù)小于根節(jié)點(diǎn)的值瘸羡,則在左子樹遞歸查找漩仙;若查找的數(shù)據(jù)大于根節(jié)點(diǎn)的值,則在右子樹遞歸查找犹赖。

插入

插入的數(shù)據(jù)一般會(huì)放置到葉子節(jié)點(diǎn)上队他,因此也是從根節(jié)點(diǎn)開始遍歷。

  • 如果插入的數(shù)據(jù)比節(jié)點(diǎn)的數(shù)據(jù)大峻村,且節(jié)點(diǎn)的右子樹為空麸折,那么直接將插入數(shù)據(jù)作為右子樹節(jié)點(diǎn);如果不為空粘昨,則循環(huán)遍歷右子樹垢啼,查找插入位置窜锯。

  • 同理,如果插入的數(shù)據(jù)比節(jié)點(diǎn)數(shù)據(jù)小芭析,且節(jié)點(diǎn)的左子樹為空锚扎,那么將插入數(shù)據(jù)作為左子樹節(jié)點(diǎn);如果不為空馁启,則循環(huán)遍歷左子樹驾孔,查找插入位置。

刪除

刪除二叉查找樹的操作分為三種情況:

一惯疙、刪除的節(jié)點(diǎn)沒有左右子樹翠勉,那么直接將父節(jié)點(diǎn)指向該刪除節(jié)點(diǎn)的指針,設(shè)置為null

二霉颠、刪除的節(jié)點(diǎn)有一個(gè)子節(jié)點(diǎn)对碌,那么將父節(jié)點(diǎn)的指向刪除節(jié)點(diǎn)的指針,改為指向刪除節(jié)點(diǎn)的子節(jié)點(diǎn)

三蒿偎、刪除的節(jié)點(diǎn)有兩個(gè)子節(jié)點(diǎn)朽们,需要遍歷找到刪除節(jié)點(diǎn)的右子樹中最小的節(jié)點(diǎn),將最小的節(jié)點(diǎn)替換到刪除節(jié)點(diǎn)上酥郭,最后將最小節(jié)點(diǎn)刪除

時(shí)間復(fù)雜度

時(shí)間復(fù)雜度和樹的高度成正比华坦,即o(height)

一愿吹、最壞情況

若子節(jié)點(diǎn)都在某一側(cè)不从,就會(huì)退化成鏈表,時(shí)間復(fù)雜度為o(n)

二犁跪、最穩(wěn)定情況

對(duì)于n個(gè)節(jié)點(diǎn)的完全二叉樹來說椿息,樹的高度介于這兩者之間:

n >= 1+2+4+8+...+2^(L-2)+1

n <= 1+2+4+8+...+2(L-2)+2(L-1)

L 的范圍是[log2(n+1), log2n +1]。完全二叉樹的層數(shù)小于等于 log(2底數(shù)) n +1坷衍,也就是說寝优,完全二叉樹的高度小于等于 log(2底數(shù)) n。

顯然枫耳,極度不平衡的二叉查找樹乏矾,它的查找性能肯定不能滿足我們的需求。我們需要構(gòu)建一種不管怎么刪除迁杨、插入數(shù)據(jù)钻心,在任何時(shí)候,都能保持任意節(jié)點(diǎn)左右子樹都比較平衡的二叉查找樹铅协,因此衍生出一種特殊的二叉查找樹捷沸,平衡二叉查找樹。平衡二叉查找樹的高度接近 logn狐史,所以插入痒给、刪除说墨、查找操作的時(shí)間復(fù)雜度也比較穩(wěn)定,是 O(logn)苍柏。

實(shí)戰(zhàn)題

leetcode 104題尼斧,如何求一顆二叉樹的高度


public int maxDepth(TreeNode root) {

if (root == null) return 0;

if (root.left == null && root.right == null) return 1;

int leftDepth = maxDepth(root.left);

int rightDepth = maxDepth(root.right);

return leftDepth >= rightDepth ? leftDepth + 1 : rightDepth + 1;

}

leetcode 450題,二叉查找樹的刪除操作


public TreeNode deleteNode(TreeNode root, int key) {

TreeNode del = root;

TreeNode delParent = null;

// 查找刪除節(jié)點(diǎn)

while (del != null) {

if (del.val == key) break;

if (key > del.val) {

delParent = del;

del = del.right;

} else {

delParent = del;

del = del.left;

}

}

if (del == null) return root;

// 若刪除節(jié)點(diǎn)的存在兩個(gè)子節(jié)點(diǎn)试吁,找到右子樹的最小節(jié)點(diǎn)替換

if (del.left != null && del.right != null) {

TreeNode minDel = del.right;

TreeNode minDelParent = del;

while (minDel.left != null) {

minDelParent = minDel;

minDel = minDel.left;

}

del.val = minDel.val;

del = minDel;

delParent = minDelParent;

}

// 若刪除節(jié)點(diǎn)只存在一個(gè)子節(jié)點(diǎn),或刪除節(jié)點(diǎn)沒有子節(jié)點(diǎn)

TreeNode child;

if (del.left != null) child = del.left;

else if (del.right != null) child = del.right;

else child = null;

// 刪除節(jié)點(diǎn)

if (delParent == null) return child;

else if (delParent.left == del) delParent.left = child;

else delParent.right = child;

return root;

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末突颊,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子潘悼,更是在濱河造成了極大的恐慌律秃,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件治唤,死亡現(xiàn)場(chǎng)離奇詭異棒动,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)宾添,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門船惨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人缕陕,你說我怎么就攤上這事粱锐。” “怎么了扛邑?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵怜浅,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我蔬崩,道長(zhǎng)恶座,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任沥阳,我火速辦了婚禮跨琳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘桐罕。我一直安慰自己脉让,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布功炮。 她就那樣靜靜地躺著溅潜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪死宣。 梳的紋絲不亂的頭發(fā)上伟恶,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音毅该,去河邊找鬼博秫。 笑死潦牛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的挡育。 我是一名探鬼主播巴碗,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼即寒!你這毒婦竟也來了橡淆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤母赵,失蹤者是張志新(化名)和其女友劉穎逸爵,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凹嘲,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡师倔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了周蹭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片趋艘。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖凶朗,靈堂內(nèi)的尸體忽然破棺而出瓷胧,到底是詐尸還是另有隱情,我是刑警寧澤棚愤,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布搓萧,位于F島的核電站,受9級(jí)特大地震影響遇八,放射性物質(zhì)發(fā)生泄漏矛绘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一刃永、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧羊精,春花似錦斯够、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至燃少,卻和暖如春束亏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背阵具。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工碍遍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留定铜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓怕敬,卻偏偏與公主長(zhǎng)得像揣炕,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子东跪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355