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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

二叉树经典题之二叉树最近公共祖先(LeetCode)

發布時間:2025/3/15 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二叉树经典题之二叉树最近公共祖先(LeetCode) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言:

二叉樹刷題是有固定思維的,請移步

README】二叉樹刷題框架

文章目錄

  • 前言:
  • 二叉樹的最近公共祖先
  • 思路一
    • 思路
    • 代碼
  • 思路二
    • 思路
    • 代碼

二叉樹的最近公共祖先

題目

點擊跳轉:LeetCode

思路一

思路

從題目中的描述可以發現如下規律

  • 如果結點p和結點q在分別在root結點的左右子樹,那么root結點便是p和q的最近公共祖先
  • 如果結點p和結點q都在root結點的左子樹,那么就要到左子樹中尋找;相反就要去右子樹中尋找
  • 某次尋找時如果出現了root==q或root==p的情況,例如示例中的結點5和結點4,那么此時root結點就是最近高公共祖先

代碼

class Solution { public:bool Find(TreeNode* root,TreeNode* target)//找尋某個結點是否存在{if(root==nullptr)return false;if(root==target)return true;return Find(root->left,target) || Find(root->right,target);}TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if(root==nullptr)return nullptr;if(root==p || root==q)//上圖中結點5和結點4的情況return root;//定義4個布爾類型,用于判斷p在root左面還是右面,q在root的左面還是右面bool pInleft,pInright,qInleft,qInright;pInleft=Find(root->left,p);pInright=!pInleft;qInleft=Find(root->left,q);qInright=!qInleft;if((pInleft && qInright) || (pInright && qInleft))//如果p和q分別在root的左(右)和右(左),那么root就是最近公共祖先{return root;}else if(pInleft && qInleft)//如果p和q在root的左面,那么就遞歸到左子樹尋找{return lowestCommonAncestor(root->left,p,q);}else//如果p和q在root的右面,那么就遞歸到右子樹尋找return lowestCommonAncestor(root->right,p,q);} };

思路二

思路

可以使用兩個棧pPath和qPath,分別保存結點p和結點q的所有祖先,然后這道題實際就轉化為了鏈表相交的那道題,當pPath.size()==qPaht.size()時,棧頂就是最近公共祖先

代碼

class Solution { public:bool Find(TreeNode* root,TreeNode* x,stack<TreeNode*>& path){if(root==nullptr)return false;path.push(root);//如果root不等于nullptr,那么先入棧if(root==x)//如果恰好root就是要找的結點,那么直接返回return true;if(Find(root->left,x,path))//如果root不是要找的結點,那么x結點可能存在于root的左子樹或右子樹中,所以遞歸return true;if(Find(root->right,x,path))return true;path.pop();//如果運行到這里還沒有找到,說明root不可能是x的一個祖先return false;//所以返回false}TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {stack<TreeNode*> pPath;//結點p的所有祖先存放在這個棧里面stack<TreeNode*> qPath;//結點q的所有祖先存放在這個棧里面Find(root,p,pPath);Find(root,q,qPath);//不知道哪個棧長,反正讓它們相等即可while(pPath.size() > qPath.size())pPath.pop();while(qPath.size() > pPath.size())qPath.pop();while(pPath.top()!=qPath.top())//當棧頂元素相等時,此時保存的就是最近公共祖先{pPath.pop();qPath.pop();}return pPath.top();} };

總結

以上是生活随笔為你收集整理的二叉树经典题之二叉树最近公共祖先(LeetCode)的全部內容,希望文章能夠幫你解決所遇到的問題。

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