自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

每日算法:二叉樹(shù)的最近公共祖先

開(kāi)發(fā) 前端 算法
百度百科中最近公共祖先的定義為:“對(duì)于有根樹(shù) T 的兩個(gè)結(jié)點(diǎn) p、q,最近公共祖先表示為一個(gè)結(jié)點(diǎn) x,滿足 x 是 p、q 的祖先且 x 的深度盡可能大(一個(gè)節(jié)點(diǎn)也可以是它自己的祖先)?!?/div>

本文轉(zhuǎn)載自微信公眾號(hào)「三分鐘學(xué)前端」,作者sisterAn。轉(zhuǎn)載本文請(qǐng)聯(lián)系三分鐘學(xué)前端公眾號(hào)。

關(guān)于樹(shù)基礎(chǔ)看這里:適合初學(xué)者的樹(shù)

給定一個(gè)二叉樹(shù), 找到該樹(shù)中兩個(gè)指定節(jié)點(diǎn)的最近公共祖先。

百度百科中最近公共祖先的定義為:“對(duì)于有根樹(shù) T 的兩個(gè)結(jié)點(diǎn) p、q,最近公共祖先表示為一個(gè)結(jié)點(diǎn) x,滿足 x 是 p、q 的祖先且 x 的深度盡可能大(一個(gè)節(jié)點(diǎn)也可以是它自己的祖先)。”

例如,給定如下二叉樹(shù): root = [3,5,1,6,2,0,8,null,null,7,4]

示例 1:

  1. 輸入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 
  2. 輸出: 3 
  3. 解釋: 節(jié)點(diǎn) 5 和節(jié)點(diǎn) 1 的最近公共祖先是節(jié)點(diǎn) 3。 

示例 2:

  1. 輸入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4 
  2. 輸出: 5 
  3. 解釋: 節(jié)點(diǎn) 5 和節(jié)點(diǎn) 4 的最近公共祖先是節(jié)點(diǎn) 5。因?yàn)楦鶕?jù)定義最近公共祖先節(jié)點(diǎn)可以為節(jié)點(diǎn)本身。 

說(shuō)明:

  • 所有節(jié)點(diǎn)的值都是唯一的。
  • p、q 為不同節(jié)點(diǎn)且均存在于給定的二叉樹(shù)中。

解答:遞歸實(shí)現(xiàn)

解題思路:

如果樹(shù)為空樹(shù)或 p 、 q 中任一節(jié)點(diǎn)為根節(jié)點(diǎn),那么 p 、 q 的最近公共節(jié)點(diǎn)為根節(jié)點(diǎn)

如果不是,即二叉樹(shù)不為空樹(shù),且 p 、 q 為非根節(jié)點(diǎn),則遞歸遍歷左右子樹(shù),獲取左右子樹(shù)的最近公共祖先,

  • 如果 p 、 q 節(jié)點(diǎn)在左右子樹(shù)的最近公共祖先都存在,說(shuō)明 p 、 q 節(jié)點(diǎn)分布在左右子樹(shù)的根節(jié)點(diǎn)上,此時(shí)二叉樹(shù)的最近公共祖先為 root
  • 若 p 、 q 節(jié)點(diǎn)在左子樹(shù)最近公共祖先為空,那 p 、q 節(jié)點(diǎn)位于左子樹(shù)上,最終二叉樹(shù)的最近公共祖先為右子樹(shù)上 p 、q 節(jié)點(diǎn)的最近公共祖先
  • 若 p 、 q 節(jié)點(diǎn)在右子樹(shù)最近公共祖先為空,同左子樹(shù) p 、 q 節(jié)點(diǎn)的最近公共祖先為空一樣的判定邏輯
  • 如果 p 、 q 節(jié)點(diǎn)在左右子樹(shù)的最近公共祖先都為空,則返回 null

代碼實(shí)現(xiàn):

  1. const lowestCommonAncestor = function(root, p, q) { 
  2.     if(root == null || root == p || root == q) return root 
  3.     const left = lowestCommonAncestor(root.left, p, q) 
  4.     const right = lowestCommonAncestor(root.right, p, q) 
  5.     if(left === nullreturn right 
  6.     if(right === nullreturn left 
  7.     return root 
  8. }; 

復(fù)雜度分析:

時(shí)間復(fù)雜度:O(n)

 

空間復(fù)雜度:O(n)

 

責(zé)任編輯:武曉燕 來(lái)源: 三分鐘學(xué)前端
相關(guān)推薦

2021-08-27 11:36:44

二叉樹(shù)回溯節(jié)點(diǎn)

2021-09-29 10:19:00

算法平衡二叉樹(shù)

2021-08-31 11:35:24

二叉搜索樹(shù)迭代法公共祖先

2021-09-15 07:56:32

二叉樹(shù)層次遍歷

2020-04-27 07:05:58

二叉樹(shù)左子樹(shù)右子樹(shù)

2013-07-15 16:35:55

二叉樹(shù)迭代器

2020-09-23 18:25:40

算法二叉樹(shù)多叉樹(shù)

2020-12-22 08:56:51

JavaScript數(shù)據(jù)結(jié)構(gòu)前端

2021-04-19 07:47:42

數(shù)據(jù)結(jié)構(gòu)二叉樹(shù)Tree

2021-04-20 08:37:14

數(shù)據(jù)結(jié)構(gòu)二叉樹(shù)樹(shù)

2021-04-28 20:12:27

數(shù)據(jù)結(jié)構(gòu)創(chuàng)建

2009-08-11 13:29:57

C#二叉樹(shù)遍歷

2020-12-30 08:35:34

貪心算法監(jiān)控

2022-10-26 23:58:02

二叉樹(shù)數(shù)組算法

2021-03-17 08:19:22

二叉樹(shù)LeetCode樹(shù)

2020-11-02 09:15:47

算法與數(shù)據(jù)結(jié)構(gòu)

2021-10-12 09:25:11

二叉樹(shù)樹(shù)形結(jié)構(gòu)

2018-03-15 08:31:57

二叉樹(shù)存儲(chǔ)結(jié)構(gòu)

2021-03-22 08:23:29

LeetCode二叉樹(shù)節(jié)點(diǎn)

2023-05-08 15:57:16

二叉樹(shù)數(shù)據(jù)結(jié)構(gòu)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)