ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

二叉排序树逻辑分析及代码实现

2022-07-28 23:04:00  阅读:153  来源: 互联网

标签:node right 代码 二叉 key left 排序 节点 delete


二叉排序树主要有插入,删除这两个操作,二叉排序树是基于中序输出实现的,所以需满足左指针节点数据<节点数据<右指针节点数据

 

首先二叉排序树的数据类型定义为结构体,数据包含数据,节点的左指针,节点的右指针

1 struct node
2 {
3     int key;
4     node* left;
5     node* right;
6 };

接着是二叉排序树的插入操作,基本逻辑如下图:

代码实现如下:

 1 void insert(int key, node* Node)
 2 {
 3     node* temp1 = Node;//指针1
 4     node* pre = NULL;//指针2
 5     while (temp1 != NULL)
 6     {
 7         pre = temp1;
 8         if (key < temp1->key) temp1 = temp1->left;
 9         else temp1 = temp1->right;
10     }
11     if (key < pre->key)
12     {
13         pre->left = new node;
14         pre->left->key = key;
15         pre->left->left = NULL;
16         pre->left->right = NULL;
17     }
18     else
19     {
20         pre->right = new node;
21         pre->right->key = key;
22         pre->right->left = NULL;
23         pre->right->right = NULL;
24     }
25 }
View Code

最后是删除操作,二叉排序树删除操作有些复杂,考虑情况很多,逻辑梳理如下图:

代码如下:

 

 1 void node_delete(int key, node* Node)
 2 {
 3     if (Node == NULL)//(特殊情况考虑)
 4     {
 5         return;
 6     }
 7     else
 8     {
 9         node* delete_node = Node;
10         if (delete_node->key == key)
11         {
12             node* father_node = prev(root,Node, key);//用于找到删除节点的父亲是谁
13             if (delete_node->right == NULL)//删除节点只有左儿子或没有儿子
14             {
15                 node* son_node = delete_node->left;
16                 if (delete_node == root)//删除节点是根节点
17                 {
18                     delete_node->left = NULL;
19                     root = son_node;
20                     delete delete_node;
21                 }
22                 else if (father_node->left != NULL && father_node->left->key == key)//删除节点不是根节点并且删除节点是其父亲的左儿子
23                 {
24                     father_node->left = son_node;
25                     delete delete_node;
26                 }
27                 else//删除节点不是根节点并且删除节点是其父亲的右儿子
28                 {
29                     father_node->right = son_node;
30                     delete delete_node;
31                 }
32             }
33             else if (delete_node->left == NULL)
34             {
35                 node* son_node = delete_node->right;
36                 if (delete_node == root)//删除节点是根节点
37                 {
38                     delete_node->right = NULL;
39                     root = son_node;
40                     delete delete_node;
41                 }
42                 else if (father_node->left != NULL && father_node->left->key == key)//删除节点不是根节点并且删除节点是其父亲的左儿子
43                 {
44                     father_node->left = son_node;
45                     delete delete_node;
46                 }
47                 else//删除节点不是根节点并且删除节点是其父亲的右儿子
48                 {
49                     father_node->right = son_node;
50                     delete delete_node;
51                 }
52             }
53             else//删除节点有两个儿子
54             {
55                 node* t1 = Node->left;
56                 node* t2 = Node;
57                 while (t1 ->right!= NULL)
58                 {
59                     t2 = t1;
60                     t1 = t1->right;
61                 }//t2定位到左子树的最大值的父亲,t2的右孩子是t1
62                 if (t2 != Node)
63                 {
64                     Node->key = t1->key;
65                     node* delete_node = t1;
66                     t2->right = t1->left;
67                     delete delete_node;
68                 }
69                 else//(特殊情况考虑)
70                 {
71                     Node->left = t1->left;
72                     delete t1;
73                 }
74             }
75         }
76         else if (key < delete_node->key) node_delete(key, delete_node->left);
77         else node_delete(key, delete_node->right);
78     }
79 }
80 node* prev(node* root,node* Node, int key)
81 {
82     if (Node == root||root==NULL)//树为空集或查询的是根节点木有父亲(特殊情况考虑)
83     {
84         return Node;
85     }
86     else
87     {
88         if (root->left != NULL && root->left->key == key) return root;
89         else if (root->right != NULL && root->right->key == key) return root;
90         else if (key < root->key) return prev(root->left, Node, key);
91         else return prev(root->right,Node, key);
92     }
93     
94 }
View Code

 

标签:node,right,代码,二叉,key,left,排序,节点,delete
来源: https://www.cnblogs.com/wangxiaomeidegou/p/16530557.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有