找回密码
 立即注册
首页 业界区 科技 算法day17-二叉树(7)

算法day17-二叉树(7)

绘纵 昨天 10:14
目录


  • 二叉搜索树的最近公共祖先
  • 二叉搜索树中的插入操作
  • 删除二叉搜索树中的节点
一、二叉搜索树的最近公共祖先

 https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/description/?envType=problem-list-v2&envId=8At1GmaZ
1.png

  方法一:
  1. class Solution {
  2.     TreeNode res = new TreeNode(-1);
  3.     public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
  4.         if(root == null){
  5.             return null;
  6.         }
  7.         // System.out.print(res == null);
  8.         int x = p.val, y = q.val;
  9.         if(x > y){
  10.             int temp = x;
  11.             x = y;
  12.             y = temp;
  13.         }
  14.         findAncestor(root, x, y);
  15.         return res;
  16.     }
  17.     public void findAncestor(TreeNode root, int x, int y){
  18.         if(res.val != -1){
  19.             return;
  20.         }
  21.         if(root.val >= x && root.val <= y){
  22.             //返回答案
  23.             // System.out.println("find" + " " +root.val);
  24.             res = root;
  25.             return;
  26.         }
  27.         if(root.val > x && root.val > y ){
  28.             findAncestor(root.left, x, y);   
  29.         }else if(root.val < x && root.val < y){
  30.             findAncestor(root.right, x, y);  
  31.         }
  32.     }
  33. }
复制代码
  方法二:非递归。
  1. class Solution{
  2.     public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
  3.         while((long)(root.val - p.val) * (root.val - q.val) > 0){
  4.             root = p.val < root.val ? root.left : root.right;
  5.         }
  6.         return root;
  7.     }  
  8. }
复制代码
二、二叉搜索树中的插入操作

 https://leetcode.cn/problems/insert-into-a-binary-search-tree/?envType=problem-list-v2&envId=8At1GmaZ
2.png

 
  1. class Solution {
  2.     public TreeNode insertIntoBST(TreeNode root, int val) {
  3.         if(root == null) return new TreeNode(val);
  4.         TreeNode node = root;
  5.         while(true){
  6.             if(node.val < val){
  7.                 if(node.right == null){
  8.                     node.right = new TreeNode(val);
  9.                     break;
  10.                 }else{
  11.                     node = node.right;
  12.                 }
  13.             }else{
  14.                 if(node.left == null){
  15.                     node.left = new TreeNode(val);
  16.                     break;
  17.                 }else{
  18.                     node = node.left;
  19.                 }
  20.             }
  21.         }
  22.         return root;
  23.     }
  24. }
复制代码
 
三、删除二叉搜索树中的节点

https://leetcode.cn/problems/delete-node-in-a-bst/?envType=problem-list-v2&envId=8At1GmaZ

 
  1. class Solution{
  2.     if(root == null)    return null;
  3.         if(key > root.val){
  4.             root.right = deleteNode(root.right, key);
  5.         }else if(key < root.val){
  6.             root.left = deleteNode(root.left, key);
  7.         }else{
  8.             if(root.left == null)   return root.right;
  9.             else if(root.right == null)  return root.left;
  10.             else if(root.left != null && root.right != null){
  11.                 TreeNode node = root.right;     //保存当前节点的右子树
  12.                 while(node.left != null){
  13.                     node = node.left;           //寻找要删除的节点右子树的最左节点
  14.                 }
  15.                 node.left = root.left;      // 将欲删除节点的左子树成为其右子树的最左节点的左子树
  16.                 root = root.right;      //欲删除节点的右子顶替其位置,节点被删除
  17.             }
  18.         }
  19.         return root;
  20.     }
  21. }
复制代码
 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册