题目:二叉搜索树的最小共同父节点
Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST.
According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes v and w as the lowest node in T that has both v and w as descendants (where we allow a node to be a descendant of itself).”
_______6______ / \ ___2__ ___8__ / \ / \ 0 _4 7 9 / \ 3 5
For example, the lowest common ancestor (LCA) of nodes 2
and 8
is 6
. Another example is LCA of nodes 2
and 4
is 2
, since a node can be a descendant of itself according to the LCA definition.
题意:
给定一个二叉搜索树(BST),在二叉搜索树中找到给定两个节点的最小共同父节点(LCA)。
最小共同父节点(LCA)定义:在有根树T中,找到一个距离根节点最远的节点x,使得x同时为节点v,w的公共节点(这里允许一个节点作为其本身的子节点)。
例如,在上图中,节点2和节点8的最小公共父节点是节点6,节点2和节点4的最小公共父节点是节点2,一个节点可以是其本身的子节点。
思路一:
使用递归求解,由于二叉搜索树的特点是左<根<右,所以根节点的值一直都是中间值,大于左子树的所有节点值,小于右子树的所有节点值,那么我们可以做如下的判断,如果根节点的值大于p和q之间的较大值,说明p和q都在左子树中,那么此时我们就进入根节点的左子节点继续递归,如果根节点小于p和q之间的较小值,说明p和q都在右子树中,那么此时我们就进入根节点的右子节点继续递归,如果都不是,则说明当前根节点就是最小共同父节点,直接返回即可。
代码:C++版:40ms
/** * 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: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { if (!root) return NULL; if (root->val > max(p->val, q->val)) return lowestCommonAncestor(root->left, p, q); else if (root->val < min(p->val, q->val)) return lowestCommonAncestor(root->right, p, q); else return root; } };
思路二:
采用迭代的方式实现,使用while循环替代递归调用,通过不断的更新根节点来实现整个二叉搜索树的迭代。
代码:C++版:36ms
/** * 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: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { while (true) { if (root->val > max(p->val, q->val)) root = root->left; else if (root->val < min(p->val, q->val)) root = root->right; else break; } return root; } };