代码随想录算法训练营第二十二天| LeetCode235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

235. 二叉搜索树的最近公共祖先

题目描述: 235. 二叉搜索树的最近公共祖先.

解法

递归
class Solution(object):
    def lowestCommonAncestor(self, root, p, q):
        if root.val > q.val and root.val > p.val:
            return self.lowestCommonAncestor(root.left,p,q)
        elif root.val < p.val and root.val <q.val:
            return self.lowestCommonAncestor(root.right,p,q)
        return root

主要思路就是,第一个符合在p和q之间的值的节点,就是他们的最近公共祖先

迭代
class Solution(object):
    def lowestCommonAncestor(self, root, p, q):
        while root:
            if root.val < p.val and root.val < q.val:
                root = root.right
            elif root.val > p.val and root.val > q.val:
                root = root.left
            else:
                return root

因为题目说了必定会有一个这样的节点,所以return root即可

701.二叉搜索树中的插入操作

题目描述: 701.二叉搜索树中的插入操作.

解法

递归
class Solution(object):
    def travel(self,node,val):
        if not node:
            return TreeNode(val=val)
        if node.val > val:
            node.left = self.travel(node.left,val)
        else:
            node.right = self.travel(node.right,val)
        return node
            
    def insertIntoBST(self, root, val):
        return self.travel(root,val)

按顺序找就行了,注意函数的返回值是什么就好

迭代
class Solution(object):
    def insertIntoBST(self, root, val):
        if not root:
            return TreeNode(val)
        pre = None
        cur = root
        while cur:
            pre = cur
            if cur.val > val:
                cur = cur.left
            else:
                cur = cur.right
        if pre.val < val:
            pre.right = TreeNode(val)
        else:
            pre.left = TreeNode(val)
        return root

450.删除二叉搜索树中的节点

题目描述: 450.删除二叉搜索树中的节点.

递归
class Solution(object):
    def deleteNode(self, root, key):
        if not root:
            return 
        if root.val > key:
            root.left = self.deleteNode(root.left,key)
        if root.val < key:
            root.right = self.deleteNode(root.right,key)
        if root.val == key:
            if not root.left and not root.right:# 没有子节点
                return None
            elif not root.left and root.right:
                return root.right
            elif not root.right and root.left:
                return root.left
            else:
                cur = root.right
                while cur.left:
                    cur = cur.left
                cur.left = root.left
                return root.right
        return root

掌握好不同情况就行
1.没找到,直接返回就好
2.找到了,该节点没有指向任何东西,那在该结点的返回的就可以直接是None
3.找到了,该节点有左孩子,没有右孩子,那就返回左孩子
4.找到了,该节点有右孩子,没有左孩子,那就返回右孩子
5.找到了,该节点又有左孩子又有右孩子,可以将左孩子接到右孩子的最左端节点,然后返回右节点就好了

你可能感兴趣的:(算法)