1.若二叉樹是一個搜索二叉樹
從樹的根節點開始和兩個節點作比較,如果當前節點的值比兩個節點的值都大,則這兩個節點的最近公共祖先節點一定在該節點的左子樹中,則下一步遍歷當前節點的左子樹;如果當前節點的值比兩個節點的值都小,則這兩個節點的最近公共祖先節點一定在該節點的右子樹中,下一步遍歷當前節點的右子樹;這樣直到找到第一個值是兩個輸入節點之間的值的節點,該節點就是兩個節點的最近公共祖先節點。
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { if(!root)return NULL; else if((root->val>p->val&&root->val<q->val)||(root->val<p->val&&root->val>q->val))return root; else if(root->val==p->val||root->val==q->val)return root; else if(root->val>p->val&&root->val>q->val)return lowestCommonAncestor(root->left,p,q); else{ return lowestCommonAncestor(root->right,p,q); } }
迭代:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { while(root){ if(root==p||root==q||root==NULL)return root; else if((root->val>p->val&&root->val<q->val)||(root->val<p->val&&root->val>q->val))return root; else if(root->val<p->val&&root->val<q->val)root=root->right; else root=root->left; } return NULL; }
2.若是一棵普通二叉樹
從根節點開始遍歷,如果node1和node2中的任一個和root匹配,那么root就是最低公共祖先。 如果都不匹配,則分別遞歸左、右子樹,如果有一個 節點出現在左子樹,並且另一個節點出現在右子樹,則root就是最低公共祖先. 如果兩個節點都出現在左子樹,則說明最低公共祖先在左子樹中,否則在右子樹。
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { if(root==NULL)return NULL; if(root==p||root==q)return root; TreeNode* left=lowestCommonAncestor(root->left,p,q); TreeNode* right=lowestCommonAncestor(root->right,p,q); if(left!=NULL&&right!=NULL)return root; else if(left!=NULL)return left; else if(right!=NULL)return right; else return NULL; }