• 面试题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 }
  • 相关阅读:
    栈的压入,弹出序列
    json格式实现批量删除
    ExtJS pagingtoolbar的使用
    Unknown initial character set index '45' received from server. Initial client ch
    事务的原子性
    整合Struts2.2+Spring3.0
    两种方法判断输入是否整数
    使用三种不同循环结构对1+2+3+...+100 求和
    使用循环的方式输出对应图形
    系统任务栏图标透明且无法打开解决办法 for Windows
  • 原文地址:https://www.cnblogs.com/wxquare/p/6868071.html
Copyright © 2020-2023  润新知