偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

每日算法:二叉樹的最近公共祖先

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

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

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

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

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

例如,給定如下二叉樹: 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)本身。 

說明:

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

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

解題思路:

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

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

  • 如果 p 、 q 節(jié)點(diǎn)在左右子樹的最近公共祖先都存在,說明 p 、 q 節(jié)點(diǎn)分布在左右子樹的根節(jié)點(diǎn)上,此時(shí)二叉樹的最近公共祖先為 root
  • 若 p 、 q 節(jié)點(diǎn)在左子樹最近公共祖先為空,那 p 、q 節(jié)點(diǎn)位于左子樹上,最終二叉樹的最近公共祖先為右子樹上 p 、q 節(jié)點(diǎn)的最近公共祖先
  • 若 p 、 q 節(jié)點(diǎn)在右子樹最近公共祖先為空,同左子樹 p 、 q 節(jié)點(diǎn)的最近公共祖先為空一樣的判定邏輯
  • 如果 p 、 q 節(jié)點(diǎn)在左右子樹的最近公共祖先都為空,則返回 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é)任編輯:武曉燕 來源: 三分鐘學(xué)前端
相關(guān)推薦

2021-08-27 11:36:44

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

2021-09-29 10:19:00

算法平衡二叉樹

2021-08-31 11:35:24

二叉搜索樹迭代法公共祖先

2021-09-15 07:56:32

二叉樹層次遍歷

2020-04-27 07:05:58

二叉樹左子樹右子樹

2013-07-15 16:35:55

二叉樹迭代器

2020-09-23 18:25:40

算法二叉樹多叉樹

2020-12-22 08:56:51

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

2021-04-28 20:12:27

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

2021-04-19 07:47:42

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

2021-04-20 08:37:14

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

2009-08-11 13:29:57

C#二叉樹遍歷

2020-12-30 08:35:34

貪心算法監(jiān)控

2022-10-26 23:58:02

二叉樹數(shù)組算法

2021-03-17 08:19:22

二叉樹LeetCode

2021-10-12 09:25:11

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

2021-03-22 08:23:29

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

2023-05-08 15:57:16

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

2020-11-02 09:15:47

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

2018-03-15 08:31:57

二叉樹存儲結(jié)構(gòu)
點(diǎn)贊
收藏

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