Article / 文章

LeetCode第235题:二叉搜索树的最近公共祖先

LeetCode第235题:二叉搜索树的最近公共祖先

��# LeetCode,{235����N�Sd”}h�vgяlQqQVyHQ ## ��c�� ��[N*N�N�Sd”}h, b0R�h-N$NNc�[���p�vgяlQqQVyHQ0 v�^v�y-NgяlQqQVyHQ�v�[IN:N�“�[�N g9hh T �v$N*N��p p0q �gяlQqQVyHQh�:y:NN*N��p x ��n�� x /f p0q �vVyHQN x �v�m�^=\�S��’Y�NN���p_N�S�N/f�[��]�vVyHQ �0” �O�Y ���[�Y N�N�Sd”}h: root = [6,2,8,0,4,7,9,null,null,3,5] 6 / \ 2 8 / \ / \ 0 4 7 9 / \ 3 5 ���^��{US ### :y�O :y�O 1: ��eQ: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8 ���Q: 6 �ʑ: ���p 2 �T���p 8 �vgяlQqQVyHQ/f 60 :y�O 2: ��eQ: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4 ���Q: 2 �ʑ: ���p 2 �T���p 4 �vgяlQqQVyHQ/f 2, �V:N9hnc�[INgяlQqQVyHQ���p�S�N:N���p,g��0 ### �gag�N - @b g���p�v<P��/f/UN�v0 - p0q :NN T���pNGWX[(W�N�~�[�v�N�Sd”}h-N0 ## ㉘�� ُS����vsQ.�(W�N)R(u�N�Sd"}h�vyr'��[�N�Na���p �vQ�]P[h N@b g���p�v<P��\�N勂��p�v<P �vQ�SP[h N@b g���p�v<P��‘Y�N勂��p�v<P0 9hncُNyr’ �b�N�S�N�����N N�{�l� ### �e�lN���N 1. �N9h���p_�YM��Sh 2. �Y�gS_MR���p�v<P'Y�N p �T q �v<P ��f p �T q ��(WS_MR���p�v�]P[h-N ��Vdk\S_MR���p�y�R0RvQ�]P[���p 3. �Y�gS_MR���p�v<P\�N p �T q �v<P ��f p �T q ��(WS_MR���p�v�SP[h-N ��Vdk\S_MR���p�y�R0RvQ�SP[���p 4. �Y�gS_MR���p�v<P�N�N p �T q KN���sSN*N'Y�NI{�NS_MR���p<P �N*N\�NI{�NS_MR���p<P � ���HNS_MR���p1\/fgяlQqQVyHQ ُ�y�e�l�v�e��YBg�^:N O(h) �vQ-N h /fh�vؚ�^0�[�Ns^a��v�N�Sd"}h ��e��YBg�^:N O(log n)�zz��YBg�^:N O(1)0 ### �e�l�N��R_ �R_�e�l�v�{|<O� 1. �Y�g p �T q �v<P��\�NS_MR���p�v<P ��R_0W(W�]P[h-N�[~b 2. �Y�g p �T q �v<P��‘Y�NS_MR���p�v<P ��R_0W(W�SP[h-N�[~b 3. &TR �S_MR���p1/fgяlQqQVyHQ ُ�y�e�l�v�e��YBg�^N:N O(h)�zz��YBg�^:N O(h) �;N��/f1u�N�R_�(uh�v�m�^0 ## �Nx�[�s ### �e�lN���N #### C#�[�s csharp /** * Definition for a binary tree node. * public class TreeNode { * public int val; * public TreeNode left; * public TreeNode right; * public TreeNode(int x) { val = x; } * } */ public class Solution { public TreeNode LowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { TreeNode current = root; while (current != null) { // �Y�gp�Tq��(Wcurrent�v�SP[h-N if (p.val > current.val && q.val > current.val) { current = current.right; } // �Y�gp�Tq��(Wcurrent�v�]P[h-N else if (p.val < current.val && q.val < current.val) { current = current.left; } // ~b0R�NgяlQqQVyHQ else { return current; } } return null; } } #### Python�[�s python # Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': current = root while current: # �Y�gp�Tq��(Wcurrent�v�SP[h-N if p.val > current.val and q.val > current.val: current = current.right # �Y�gp�Tq��(Wcurrent�v�]P[h-N elif p.val < current.val and q.val < current.val: current = current.left # ~b0R�NgяlQqQVyHQ else: return current return None #### C++�[�s cpp /** * 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) { TreeNode* current = root; while (current != nullptr) { // �Y�gp�Tq��(Wcurrent�v�SP[h-N if (p->val > current->val && q->val > current->val) { current = current->right; } // �Y�gp�Tq��(Wcurrent�v�]P[h-N else if (p->val < current->val && q->val < current->val) { current = current->left; } // ~b0R�NgяlQqQVyHQ else { return current; } } return nullptr; } }; ### �e�l�N��R_ #### C#�[�s csharp public class Solution { public TreeNode LowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { // �Y�gp�Tq��(Wroot�v�SP[h-N if (p.val > root.val && q.val > root.val) { return LowestCommonAncestor(root.right, p, q); } // �Y�gp�Tq��(Wroot�v�]P[h-N else if (p.val < root.val && q.val < root.val) { return LowestCommonAncestor(root.left, p, q); } // ~b0R�NgяlQqQVyHQ else { return root; } } } #### Python�[�s python class Solution: def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': # �Y�gp�Tq��(Wroot�v�SP[h-N if p.val > root.val and q.val > root.val: return self.lowestCommonAncestor(root.right, p, q) # �Y�gp�Tq��(Wroot�v�]P[h-N elif p.val < root.val and q.val < root.val: return self.lowestCommonAncestor(root.left, p, q) # ~b0R�NgяlQqQVyHQ else: return root #### C++�[�s cpp class Solution { public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { // �Y�gp�Tq��(Wroot�v�SP[h-N if (p->val > root->val && q->val > root->val) { return lowestCommonAncestor(root->right, p, q); } // �Y�gp�Tq��(Wroot�v�]P[h-N else if (p->val < root->val && q->val < root->val) { return lowestCommonAncestor(root->left, p, q); } // ~b0R�NgяlQqQVyHQ else { return root; } } }; ## ’��R�g ### �e��YBg�^ - �e�lN���N ��O(h) �vQ-N h /fh�vؚ�^0�[�Ns^a��v�N�Sd"}h ��e��YBg�^:N O(log n) �gOW��Q N�h�S:N��h� �:N O(n)0 - �e�l�N��R ��O(h) �N�e�lN�v T0 ### zz��YBg�^ - �e�lN���N ��O(1) ��S����Q*N�Sϑeg�OX[S_MR�r0 - �e�l�N��R_ ��O(h) ��R_�(uh�vzz�� �gOW��Q N:N O(n)0 ### �e�l�[�k | �e�l | �e��YBg�^ | zz��YBg�^ | O�R | �R�R | |------|------------|------------|------|------| | ��N | O(h) | O(1) | zz��YBg�^NO �N�Shؚq�T | �Nxeu�YBg | | �R | O(h) | O(h) | �Nxnpf�{m | �[�N�mB\h ��S���[�h�n�Q | ### T���[�s�v’���[�k �N Npenc�W�NLeetCodeh�QKmՋ�s�X��[E�<P�S�� g@bN T �� | �� | ��N�l��e | �R_�l��e | |------|------------|------------| | C++ | ~16ms | ~20ms | | C# | ~100ms | ~108ms | | Python | ~76ms | ~80ms | C++�[�s1u�NvQNO�~+Ryr'�T�v�c�QX[�{t ��8^h��s�QgsO’��0Python�TC#1u�NvQؚ�~��yr'�T�W>W�V6e:g6R �gbL���ba �FO�c�O�N�f}Y�v_�SSO��0 ## �Nxyr�p 1. )R(u�N�N�Sd”}hyr’�** ��lEQR)R(u�N�N�Sd"}h�v g�^yr' �‘Y’Y�{S�N�[bgяlQqQVyHQ�vǏ z 2. �{mؚHe� �Nx;���npf �R/e\ �ؚHegbL� 3. �(u’�** �[@b g&{T�N�Sd"}h�[IN�vh���(u 4. **3z�['� �{�l3z�[ �NX[(W�g�z��Q�[�He�s'YE^ NM� ## OS�eT dk���v�{�l�]�~�vS_OS �1u�NEQR)R(u�N�N�Sd"}h�vyr' ��e��YBg�^�]��gOO(h)0NǏ ��S�N�Q��N N��_OS� 1. ��Ytyr�k��Q�** �k�YHQ$R�ep�Tq��v<P�f\ �nx�Op.val d" q.val ��S�N�{S�k��;��� 2. **�cMR�~_g�** (W�g\pe��Q N ��Y�g�S�sS_MR���p/fpbq-N�vNN ��S�N�v�cԏ�V勂��p ## 8^���� 1. �_eu�N�Sd”}h’(��** O(u�(u�N�Sh�vgяlQqQVyHQ�{�l � ��l g)R(u�N�Sd"}h�v g�^yr' 2. �k��;������ (W�Nx-N�b“>”�T“<”�Q�S ��[�{�l1YHe 3. �l g�Q�pbq,g��1/fgяlQqQVyHQ�v�`�Q� ���vfnxc�QNN���p�S�N/f��]�vVyHQ ## �vsQ���v - LeetCode 236: �N�Sh�vgяlQqQVyHQ - LeetCode 98: �����N�Sd”}h - LeetCode 450: Rd��N�Sd”}h-N�v���p - LeetCode 700: �N�Sd”}h-N�vd”}