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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[剑指offer]面试题第[68-1]题[Leedcode][JAVA][第235题][二叉搜索树的最近公共祖先][递归][BFS]

發布時間:2023/12/10 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [剑指offer]面试题第[68-1]题[Leedcode][JAVA][第235题][二叉搜索树的最近公共祖先][递归][BFS] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【問題描述】[第235題][二叉搜索樹的最近公共祖先][簡單]

給定一個二叉搜索樹, 找到該樹中兩個指定節點的最近公共祖先。百度百科中最近公共祖先的定義為:“對于有根樹 T 的兩個結點 p、q,最近公共祖先表示為一個結點 x,滿足 x 是 p、q 的祖先且 x 的深度盡可能大(一個節點也可以是它自己的祖先)?!崩?#xff0c;給定如下二叉搜索樹: root = [6,2,8,0,4,7,9,null,null,3,5]示例 1:輸入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8 輸出: 6 解釋: 節點 2 和節點 8 的最近公共祖先是 6。

【解答思路】

1. 遞歸 后續遍歷

由于是二叉搜索樹,所以找最近的共同祖先比較容易,總共就三種情況。

  • 如果給定的兩個節點的值都小于根節點的值,那么最近的共同祖先一定在左子樹
  • 如果給定的兩個節點的值都大于根節點的值,那么最近的共同祖先一定在右子樹
  • 如果一個大于等于、一個小于等于根節點的值,那么當前根節點就是最近的共同祖先了
    至于前兩種情況用遞歸繼續去解決即可。

通過交換使得 p.val <= q.val ,這樣就可以簡化后邊 if 語句的判斷
時間復雜度:O(N) 空間復雜度:O(N)

public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {// 保持 p.val <= q.valif (p.val > q.val) {return lowestCommonAncestor(root, q, p);}//如果有一個是根節點就可以提前結束, 當然這個 if 不要也可以if (p.val == root.val || q.val == root.val) {return root;}if (q.val < root.val) {return lowestCommonAncestor(root.left, p, q);} else if (p.val > root.val) {return lowestCommonAncestor(root.right, p, q);} else {return root;}}
2. 迭代

找到分割點就可以了。這個分割點就是能讓節點 p和節點 q不能在同一顆子樹上的那個節點,或者是節點 p 和節點 q中的一個,這種情況下其中一個節點是另一個節點的父親節點

時間復雜度:O(N) 空間復雜度:O(1)

public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {int pVal = p.val;int qVal = q.val;if (pVal == root.val || qVal == root.val) {return root;}// 保持 p.val <= q.valif (pVal > qVal) {int temp = pVal;pVal = qVal;qVal = temp;}while (true) {if (qVal < root.val) {root = root.left;} else if (pVal > root.val) {root = root.right;} else {return root;}} }

【總結】

1.二叉搜索樹定義
  • 若任意節點的左子樹不空,則左子樹上所有節點的值均小于它的根節點的值;
  • 若任意節點的右子樹不空,則右子樹上所有節點的值均大于它的根節點的值;
  • 任意節點的左、右子樹也分別為二叉查找樹;
  • 沒有鍵值相等的節點。
2.二叉樹遍歷

前序遍歷 先輸出當前結點的數據,再依次遍歷輸出左結點和右結點
中序遍歷 先遍歷輸出左結點,再輸出當前結點的數據,再遍歷輸出右結點
后續遍歷 先遍歷輸出左結點,再遍歷輸出右結點,最后輸出當前結點的數據

3. 中序遍歷輸出的是一個升序數組
4. 對于二叉樹的題,開始可以用遞歸的思想去思考會比較簡單

相關題目 236

轉載鏈接:https://leetcode.wang/leetcode-235-Lowest-Common-Ancestor-of-a-Binary-Search-Tree.html

總結

以上是生活随笔為你收集整理的[剑指offer]面试题第[68-1]题[Leedcode][JAVA][第235题][二叉搜索树的最近公共祖先][递归][BFS]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。