給定一棵二叉樹,找到兩個節點的最近公共父節點(LCA)。node
最近公共祖先是兩個節點的公共的祖先節點且具備最大深度。web
假設給出的兩個節點都在樹中存在面試
對於下面這棵二叉樹this
4 / \ 3 7 / \ 5 6
LCA(3, 5) = 4
spa
LCA(5, 6) = 7
code
LCA(6, 7) = 7
orm
思路:若是兩個節點分別在根節點的左子樹和右子樹,則返回根節點。
若是兩個節點都在左子樹,則遞歸處理左子樹,若是兩個節點都在右子樹,則遞歸處理右子樹。
經典筆試題目,要熟練!blog
/** * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left, *right; * TreeNode(int val) { * this->val = val; * this->left = this->right = NULL; * } * } */ class Solution { public: /** * @param root: The root of the binary search tree. * @param A and B: two nodes in a Binary. * @return: Return the least common ancestor(LCA) of the two nodes. */ /* 思路:若是兩個節點分別在根節點的左子樹和右子樹,則返回根節點。 若是兩個節點都在左子樹,則遞歸處理左子樹,若是兩個節點都在右子樹,則遞歸處理右子樹。 這是經典筆試題目,要熟練! */ bool FindNode(TreeNode* root,TreeNode* p){ if(root==NULL||p==NULL){ return false; } if(root==p){ return true; } bool found=FindNode(root->left,p); if(!found){ found=FindNode(root->right,p); } return found; } TreeNode *lowestCommonAncestor(TreeNode *root, TreeNode *A, TreeNode *B) { // write your code here if(root==NULL){ return NULL; } if(root==A||root==B){ return root; } if(FindNode(root->left,A)){ if(FindNode(root->right,B)){ return root; } else{ return lowestCommonAncestor(root->left,A,B); } } else{ if(FindNode(root->left,B)){ return root; } else{ return lowestCommonAncestor(root->right,A,B); } } } };
另外一種思路:遞歸
先求出從根節點到兩個節點的路徑;ci
而後比較兩條路徑,最後一個相同的節點就是他們在二叉樹中的最低公共祖先。
其實將問題轉化爲求鏈表第一個相交的節點。