zoukankan      html  css  js  c++  java
  • 面试题23:二叉搜索树的查找、插入、删除

    BST的查找非常简单,插入是基于查找进行的,有一点需要注意的是插入一定是称为叶子节点的孩子节点。删除稍微麻烦一点,要分情况讨论,当要删除的节点有两个孩子节点时,首先寻找要删除节点p的左子树的最大的节点s,然后交换p和s的数值,调整s父节点的指向,删除s节点。

     1 /search x on a BST,return the node's pointer
     2 TreeNode* searchBST(TreeNode* root,int x){
     3     if(root == nullptr) return nullptr;
     4     if(root->val == x) return root;
     5     if(x > root->val) return searchBST(root->right,x);
     6     if(x < root->val) return searchBST(root->left,x);
     7     return nullptr;
     8 }
     9 
    10 TreeNode* searchBST2(TreeNode* root,int x){
    11     TreeNode* p = root;
    12     while(p){
    13         if(x == p->val) return p;
    14         else if(x > p->val) {
    15             p = p->right;
    16         }else{
    17             p = p->left;
    18         }
    19     }
    20     return nullptr;
    21 }
    22 
    23 //if bst has x return false,else insert and return true;
    24 bool insertBST(TreeNode* root,int x){
    25     TreeNode* p = root;
    26     TreeNode* pre = nullptr;
    27     while(p){
    28         if(x == p->val){
    29             return false;
    30         }else if(x > p->val){
    31             pre = p;
    32             p = p->right;
    33         }else{
    34             pre = p;
    35             p = p->left;
    36         }
    37     }
    38     TreeNode* px = new TreeNode(x);
    39     if(pre == nullptr){
    40         root = px;
    41     }else if(x < pre->val){
    42         pre->left = px;
    43     }else{
    44         pre->right = px;
    45     }
    46     return true;
    47 }
    48 
    49 
    50 void removerBST(TreeNode* root,int x){
    51     if(root == nullptr) return;
    52     TreeNode* p = root;
    53     TreeNode* pp = nullptr;
    54     while(p){
    55         if(p->val == x){{
    56             break;
    57         }
    58         }else if(x > p->val){
    59             pp = p;
    60             p = p->right;
    61         }else{
    62             pp = p;
    63             p = p->left;
    64         }
    65     }
    66 
    67     if(p == nullptr) return;  //not found!
    68 
    69     //when p has two child
    70     if(p->left && p->right){
    71         TreeNode* s = p->left;
    72         TreeNode* ps = p;
    73         while(s->right){
    74             ps = s;
    75             s = s->right;
    76         }
    77         std::swap(p->val,s->val);
    78         if(s == ps->right) ps->right = s->left;
    79         else if(s == ps->left) ps->left = s->left;
    80         delete s;
    81         return;
    82     }
    83 
    84     //when p has one or zero child
    85     TreeNode* c = nullptr;
    86     if(p->left) c = p->left;
    87     if(p->right) c = p->right;
    88     if(p==root){
    89         root = c;
    90     }else{
    91         if(p == pp->left){
    92             pp->left = c;
    93         }else{
    94             pp->right = c;
    95         }
    96         delete p;
    97     }
    98 
    99 }
  • 相关阅读:
    机器学习(深度学习)
    机器学习(六)
    机器学习一-三
    Leetcode 90. 子集 II dfs
    Leetcode 83. 删除排序链表中的重复元素 链表操作
    《算法竞赛进阶指南》 第二章 Acwing 139. 回文子串的最大长度
    LeetCode 80. 删除有序数组中的重复项 II 双指针
    LeetCode 86 分割链表
    《算法竞赛进阶指南》 第二章 Acwing 138. 兔子与兔子 哈希
    《算法竞赛进阶指南》 第二章 Acwing 137. 雪花雪花雪花 哈希
  • 原文地址:https://www.cnblogs.com/wxquare/p/6868071.html
Copyright © 2011-2022 走看看