1 #include<bits/stdc++.h>
  2 using namespace std;
  3 typedef struct SortTree
  4 {
  5     int data;
  6     struct SortTree* left;
  7     struct SortTree* right;
  8 }Node;
  9 Node* root;
 10 void Init(int key)
 11 {
 12     root=(Node*)malloc(sizeof(Node));  //向系统申明指针 
 13     root->data=key;
 14     root->left=NULL;
 15     root->right=NULL;
 16 }
 17 void insert(int key) 
 18 {
 19     Node* t=root;
 20     Node* pre=NULL;
 21     while (t!=NULL)
 22     {
 23         pre=t;
 24         if (key<t->data) t=t->left;
 25         else if (key>t->data) t=t->right;
 26         else return;  //若节点已经存在 则直接返回 
 27     }
 28     if (key<pre->data)
 29     {
 30         pre->left=(Node*)malloc(sizeof(Node)),pre->left->data=key;
 31         pre->left->left=NULL,pre->left->right=NULL;
 32     }
 33     else 
 34     {
 35         pre->right=(Node*)malloc(sizeof(Node)),pre->right->data=key;
 36         pre->right->left=NULL,pre->right->right=NULL;
 37     }
 38 }
 39 bool search(Node* root,int key)  //查找是否存在节点 
 40 {
 41     while (root!=NULL)
 42     {
 43         if (key==root->data) return true;
 44         else if (key<root->data) root=root->left;
 45         else root = root->right;
 46     }
 47     return false;
 48 }
 49 int delete_node(Node* node,int key)
 50 {
 51     if (node==NULL) return  -1;
 52     else
 53     {
 54         if (node->data==key)  //若找到删除节点 
 55         {
 56             Node* temp=pre_node(root,node,key);
 57             Node* t=NULL;
 58             if (node->right=NULL)    //若其右子树为空 
 59             {
 60                 temp=node;
 61                 node=node->left;
 62                 if (temp->left->data==t->data)
 63                 {
 64                     Node* free_node=t;
 65                     temp->left=node;
 66                     free(free_node);
 67                     free_node=NULL;
 68                 }
 69                 else 
 70                 {
 71                     Node* free_node=t;
 72                     temp->right=node;
 73                     free(free_node);
 74                     free_node=NULL;
 75                 }
 76             }
 77             else if (node->left==NULL)  //若其左子树为空 
 78             {
 79                 t=node;
 80                 node=node->right;
 81                 if (temp->left->data==t->data)
 82                 {
 83                     Node* free_node=t;
 84                     temp->left=node;
 85                     free(free_node);
 86                     free_node=NULL;
 87                 }
 88                 else 
 89                 {
 90                     Node* free_node=t;
 91                     t->right=node;
 92                     free(free_node);
 93                     free_node=NULL;
 94                 }
 95             }
 96             else  //若左右子树都存在,则选择左子树最大节点为节点 保证其右子树为空 
 97             {
 98                 t=node;
 99                 Node* left_max=node->left;
100                 while (left_max->right!=NULL)
101                 {
102                     t=left_max;
103                     left_max=left_max->right;
104                 }
105                 node->data=left_max->data; //已经替换数值 所以后面不需要交换指针 
106                 if (t!=node)
107                 {
108                     t->right=left_max->left;
109                     free(left_max);
110                     left_max=NULL; 
111                 }
112                 else 
113                 {
114                     t->left=left_max->left;   //相当于放一个空 
115                     free(left_max);
116                     left_max=NULL;
117                 }
118             }
119         }
120         else if (key<node->data) delete_node(node->left,key);  //接着找到目标删除节点 
121         else if (key>node->data) delete_node(node->right,key);
122     }
123 }
124 Node* pre_node(Node* root,Node* node,int key)  //找到 节点上一个父节点 
125 {
126     if (root==NULL||node==root) return node;  //特判一下根节点情况 
127     else
128     {
129         if (root->left!=NULL&&root->left->data==key) return root;
130         else if (root->right!=NULL&&root->right->data==key) return root;
131         else if (key<root->data) return pre_node(root->left,node,key);
132         else return pre_node(root->right,node,key);
133     }
134 }
135 int main ()
136 {
137     
138 }

 

原文地址:http://www.cnblogs.com/zjzjzj/p/16862125.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性