面试题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 }

 

posted @ 2017-05-17 16:06  wxquare  阅读(621)  评论(0编辑  收藏  举报