目录
- 二叉搜索树的最近公共祖先
- 二叉搜索树中的插入操作
- 删除二叉搜索树中的节点
一、二叉搜索树的最近公共祖先
https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/description/?envType=problem-list-v2&envId=8At1GmaZ
方法一:- class Solution {
- TreeNode res = new TreeNode(-1);
- public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
- if(root == null){
- return null;
- }
- // System.out.print(res == null);
- int x = p.val, y = q.val;
- if(x > y){
- int temp = x;
- x = y;
- y = temp;
- }
- findAncestor(root, x, y);
- return res;
- }
- public void findAncestor(TreeNode root, int x, int y){
- if(res.val != -1){
- return;
- }
- if(root.val >= x && root.val <= y){
- //返回答案
- // System.out.println("find" + " " +root.val);
- res = root;
- return;
- }
- if(root.val > x && root.val > y ){
- findAncestor(root.left, x, y);
- }else if(root.val < x && root.val < y){
- findAncestor(root.right, x, y);
- }
- }
- }
复制代码 方法二:非递归。- class Solution{
- public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
- while((long)(root.val - p.val) * (root.val - q.val) > 0){
- root = p.val < root.val ? root.left : root.right;
- }
- return root;
- }
- }
复制代码 二、二叉搜索树中的插入操作
https://leetcode.cn/problems/insert-into-a-binary-search-tree/?envType=problem-list-v2&envId=8At1GmaZ
- class Solution {
- public TreeNode insertIntoBST(TreeNode root, int val) {
- if(root == null) return new TreeNode(val);
- TreeNode node = root;
- while(true){
- if(node.val < val){
- if(node.right == null){
- node.right = new TreeNode(val);
- break;
- }else{
- node = node.right;
- }
- }else{
- if(node.left == null){
- node.left = new TreeNode(val);
- break;
- }else{
- node = node.left;
- }
- }
- }
- return root;
- }
- }
复制代码
三、删除二叉搜索树中的节点
https://leetcode.cn/problems/delete-node-in-a-bst/?envType=problem-list-v2&envId=8At1GmaZ
- class Solution{
- if(root == null) return null;
- if(key > root.val){
- root.right = deleteNode(root.right, key);
- }else if(key < root.val){
- root.left = deleteNode(root.left, key);
- }else{
- if(root.left == null) return root.right;
- else if(root.right == null) return root.left;
- else if(root.left != null && root.right != null){
- TreeNode node = root.right; //保存当前节点的右子树
- while(node.left != null){
- node = node.left; //寻找要删除的节点右子树的最左节点
- }
- node.left = root.left; // 将欲删除节点的左子树成为其右子树的最左节点的左子树
- root = root.right; //欲删除节点的右子顶替其位置,节点被删除
- }
- }
- return root;
- }
- }
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |