解题思路:
找到两个节点中深度大的往上跳,由于两者的距离肯定可以用二进制表示,从大到小遍历2的幂,能跳则跳,最终一定可以深度相等。深度相等后一起跳,直到两者父节点相等。
用dp[i][j]表示节点i上2^j个节点编号。转移方程为dp[i][j]=dp[dp[i][j-1]][j-1]
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: static const int N=1e5+5; int dp[N][20],depth[N]; unordered_map<int,int>mp; TreeNode* arr[N]; int cnt; void dfs(TreeNode* root,int pre) { if(!root)return; int index; if(mp[root->val]==0)mp[root->val]=++cnt; index=mp[root->val]; dp[index][0]=pre; arr[index]=root; depth[index]=depth[pre]+1; for(int i=1;(1<<i)<=depth[index];i++) { dp[index][i]=dp[dp[index][i-1]][i-1]; } dfs(root->left,index); dfs(root->right,index); } int lca(int a,int b) { if(depth[a]<depth[b])swap(a,b); for(int i=19;i>=0;i--) { if(depth[a]-(1<<i)>=depth[b])a=dp[a][i]; } if(a==b)return a; for(int i=19;i>=0;i--) { if(dp[a][i]!=dp[b][i]) { a=dp[a][i]; b=dp[b][i]; } } return dp[a][0]; } TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { dfs(root,0); int ans=lca(mp[p->val],mp[q->val]); return arr[ans]; } };
04-01
1027
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
04-23
558
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
08-17