leetcode day 22 235. 二叉搜索树的最近公共祖先 701. 二叉搜索树中的插入操作 450. 删除二叉搜索树中的节点

文章目录

  • 一、leetcode 235. 二叉搜索树的最近公共祖先
    • 1.题目链接:
    • 2.独立做题问题总结
    • 3.解法总结:
  • 二、leetcode 701. 二叉搜索树中的插入操作
    • 1.题目链接:
    • 2.独立做题问题总结
    • 3.解法总结:
  • 三、leetcode 450. 删除二叉搜索树中的节点 §§§§
    • 1.题目链接:
    • 2.独立做题问题总结
    • 3.解法总结:§§§§§


提示:以下是本篇文章正文内容,下面案例可供参考

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

1.题目链接:

link

2.独立做题问题总结

3.解法总结:

  1. 递归
    从上往下搜索,若发现节点在pq数值之间,则一定是最近公共祖先
    搜索一条边:
		if (递归函数(root->left)) return ;
		if (递归函数(root->right)) return ;

搜索整棵树:

		left = 递归函数(root->left);
		right = 递归函数(root->right);
		left与right的逻辑处理;

method1 和普通二叉树一样

		def traversal(root, p, q):
            if root == None:
                return None
            if root == p or root == q:
                return root
            left = traversal(root.left, p, q)
            right = traversal(root.right, p, q)
            if left != None and right != None:
                return root
            elif left != None and right == None:
                return left
            elif left == None and right != None:
                return right
            else:
                return None
            
        return traversal(root, p, q)
		

method2:利用二叉搜索树性质,若pq均小于cur 在右侧找,若pq均大于cur在左侧找

 		def traversal(root, p, q):
            if root == None:
                return None
            if p.val > root.val and q.val > root.val:
                right = traversal(root.right, p, q)
                if right != None:
                    return right
            elif p.val < root.val and q.val < root.val:
                left = traversal(root.left, p, q)
                if left != None:
                    return left
            return root
        return traversal(root, p, q)
            
  1. 迭代
		while root:
            if p.val > root.val and q.val > root.val:
                root = root.right
            elif p.val < root.val and q.val < root.val:
                root = root.left
            else:
                return root
        return None
		

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

1.题目链接:

link

2.独立做题问题总结

3.解法总结:

遍历,当遇到空节点时直接插入
遇到空节点了,就让parent左孩子或者右孩子指向新插入的节点。然后结束递归。

		def traversal(root, val):
            if root == None:
                node = TreeNode(val)
                return node 
            if root.val > val:
                root.left = traversal(root.left, val)
            if root.val < val:
                root.right = traversal(root.right, val)
            return root
        return traversal(root, val)

  1. 迭代

三、leetcode 450. 删除二叉搜索树中的节点 §§§§

1.题目链接:

link

2.独立做题问题总结

3.解法总结:§§§§§

要改变二叉树结构

  1. 递归
    第一种情况:没找到删除的节点,遍历到空节点直接返回了
    找到删除的节点
    第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点
    第三种情况:删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点
    第四种情况:删除节点的右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点
    第五种情况:左右孩子节点都不为空,则将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。
		if root == None:
            return None
        if key < root.val: #递归
            root.left = self.deleteNode(root.left, key)
        elif key > root.val:
            root.right = self.deleteNode(root.right, key)
        else:#递归终止判断条件*(key = root.val
            if root.left == None and root.right == None:
                return None
            elif root.left != None and root.right == None:
                return root.left
            elif root.left == None and root.right != None:
                return root.right
            else: 
                cur = root.right
                while(cur.left!= None):
                    cur = cur.left
                cur.left = root.left
                return root.right
        return root    
		
  1. 迭代
		def delete(root):
            if root == None:
                return None
            if root.right == None:
                return root.left
           
            cur = root.right
            while(cur.left!= None):
                cur = cur.left
            cur.left = root.left
            return root.right
        if root == None:
            return None
        cur = root
        pre = None
        while(cur):
            if cur.val == key:
                break
            pre = cur
            if key < cur.val:
                cur = cur.left
            elif key > cur.val:
                cur = cur.right
        if pre == None:
            return delete(cur)
        if pre.left and pre.left.val == key:#判断cur是当前pre的左节点还是右节点
            pre.left = delete(pre.left)
            
        if pre.right and pre.right.val == key:
            pre.right = delete(pre.right)
            
        return root

你可能感兴趣的:(leetcode,leetcode)