• 【BST】700. Search in a Binary Search Tree; 701. Insert into a Binary Search Tree; 450. Delete Node in a BST;


    Binary Search Tree

    二叉搜索树问题。

    遍历框架:

    1 void BST(TreeNode root, int target) {
    2     if (root.val == target)
    3         // 找到目标,做点什么
    4     if (root.val < target) 
    5         BST(root.right, target);
    6     if (root.val > target)
    7         BST(root.left, target);
    8 }

    问题:

    • 700. Search in a Binary Search Tree 在二叉搜索树中,寻找指定节点。
    • 701. Insert into a Binary Search Tree 在二叉搜索树中,插入指定节点。
    • 450. Delete Node in a BST 在二叉搜索树中,删除指定节点。
     
    解法:

    700. Search in a Binary Search Tree

    代码参考:
     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
     8  *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
     9  *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
    10  * };
    11  */
    12 class Solution {
    13 public:
    14     TreeNode* searchBST(TreeNode* root, int val) {
    15         if(!root) return nullptr;
    16         if(val == root->val) return root;
    17         else if(val < root->val) return searchBST(root->left, val);
    18         else return searchBST(root->right, val);
    19     }
    20 };

    701. Insert into a Binary Search Tree

    代码参考:
     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
     8  *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
     9  *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
    10  * };
    11  */
    12 class Solution {
    13 public:
    14     TreeNode* insertIntoBST(TreeNode* root, int val) {
    15         if(!root) return new TreeNode(val);
    16         else if(val<root->val) root->left = insertIntoBST(root->left, val);
    17         else root->right = insertIntoBST(root->right, val);
    18         return root;
    19     }
    20 };

    450. Delete Node in a BST

    删除节点中,需要分类讨论
    删除的节点
    • 有0个子节点
      • 直接删除该节点,返回null
    • 有1个子节点child
      • 将子节点替代该节点,返回child
      •  
    • 有2个子节点
      • 找到 right 子树的最小值,Mright
      • 用Mright代替该节点(值替换)。返回该节点
      • 删除原来的Mright节点。
    代码参考:
     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
     8  *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
     9  *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
    10  * };
    11  */
    12 class Solution {
    13 public:
    14     //case 1: 0 child:
    15     //        return null;
    16     //case 2: 1 child:
    17     //        return this child;
    18     //case 3: 2 children:
    19     //        find the min node Mright of right tree,
    20     //        root->val = M->val
    21     //        delete M -> case 1 above
    22     TreeNode* deleteNode(TreeNode* root, int key) {
    23         if(!root) return nullptr;
    24         if(root->val == key) {
    25             //case 1, case 2
    26             if(!root->left) return root->right;
    27             if(!root->right) return root->left;
    28             //case 3
    29             TreeNode* Mright = getMin(root->right);
    30             root->val = Mright->val;
    31             //recursionly delete Mright
    32             root->right = deleteNode(root->right, Mright->val);
    33         } else if(root->val > key) {
    34             root->left = deleteNode(root->left, key);
    35         } else {
    36             root->right = deleteNode(root->right, key);
    37         }
    38         return root;
    39     }
    40     TreeNode* getMin(TreeNode* p) {
    41         while(p->left){
    42             p=p->left;
    43         }
    44         return p;
    45     }
    46 };
  • 相关阅读:
    什么是API
    Maxiee的Vim入门日记(4)——安装windows下的Cscope
    将字符串变成大写----C++实现
    POJ 3254 炮兵阵地(状态压缩DP)
    UIKit和Core Graphics绘图(三)——绘制虚线,椭圆以及饼图
    CRC 模式及实现
    [HDU 1317]XYZZY[SPFA变形][最长路]
    poj 2155 Matrix
    [置顶] Application,Session,Cookie之Application对象
    [Todo] Java及C++ Exception整理
  • 原文地址:https://www.cnblogs.com/habibah-chang/p/13757815.html
Copyright © 2020-2023  润新知