代码随想录算法训练营第二十二天 |235. 二叉搜索树的最近公共祖先、701. 二叉搜索树中的插入操作、450. 删除二叉搜索树中的节点
235. 二叉搜索树的最近公共祖先
题目链接:235. 二叉搜索树的最近公共祖先
- 第一个遍历到的在p和q之间的数一定是他们的最近公共祖先
- 迭代法注意return语句的位置
701. 二叉搜索树中的插入操作
题目链接:701. 二叉搜索树中的插入操作
- 递归函数的返回值可以进行删除和添加操作的优化
- 迭代法考虑的情况多,注意循环的跳出条件 再看看
-
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */ class Solution { public TreeNode insertIntoBST(TreeNode root, int val) { if(root == null) return new TreeNode(val); TreeNode ans = root; while(root != null){ if(root.left == null && root.val > val){ root.left = new TreeNode(val); break; } else if(root.right == null && root.val < val){ root.right = new TreeNode(val); break; } if(root.val < val){ root = root.right; } else if (root.val > val){ root = root.left; } } return ans; } } // c++分解做法 class Solution { public: // 分解 TreeNode* insertIntoBST(TreeNode* root, int val) { if(root == nullptr) { return new TreeNode(val); } if(val < root->val) { root->left = insertIntoBST(root->left, val); } if(val > root->val) { root->right = insertIntoBST(root->right, val); } // 后序遍历,左右子树完成插入操作后返回自身 return root; } };
450. 删除二叉搜索树中的节点
题目链接:450. 删除二叉搜索树中的节点
- 有受害者节点的情况其实就是将root.left腾出来为null. 然后return root.right.
- return给上一层
-
else { TreeNode curr = root.right; while(curr.left!=null){ curr = curr.left; } curr.left = root.left; return root.right; } - 也可以是先把受害者节点和当前符合删除条件的root交换,然后再递归删除掉受害者节点。(更好)
- 这两种方法不一样