二叉排序树
性质:(左右子树不空)
左子树所有结点的值都小于根节点
右子树所有结点的值都大于根节点
构建二叉排序树
根据性质一个一个插入即可
优势
中序遍历(左中右)后就已经排好序
难度
删除后可能会改变结构,代码实现
情况分析:
1.叶子结点,直接删除
2.单孩子结点,删除结点后将孩子放在删除的位置
3.左右孩子都有的结点,将排序后前后的任一结点填充到该位置(即左子树的最右边或右子树的最左边那个填充)
代码实现思路:先定位到这个待删除的结点,再给这个结点归类,根据类别删除这个结点
#include<stdio.h> #include<stdlib.h>
typedef struct TreeNode{ struct TreeNode* left,*right; int data; }Node;
void insert(Node* root,int key) { Node* pre=NULL; while(root!=NULL) { pre=root; if(key<root->data) { root=root->left } else { root=root->right; } } Node* new_node=(Node*)malloc(sizeof(Node)); new_node->left=NULL; new_node->right=NULL; new_node->data=key; if(key<pre->data) { pre->left=new_node; } else { pre->right=new_node; } }
void deleteNode(Node* root,int key) { if(root==NULL) { return; } else { if(key<root->data) { return deleteNode(root->left,key); } else if(key>root->data) { return deleteNode(root->right,key); } else { delete(root); } } }
void delete(Node* node) { Node* temp=NULL; if(node->left==NULL) { temp=node; node=node->right; } else if(node->right==NULL) { temp=node; node=node->left; } else { temp=node; Node* s=node; s=s->left; while(s->right!=NULL) { temp=s; s=s->right; } node->data=s->data; if(temp!=node) { temp->right=s->left; } else { temp->left=s->right; } } }
|
时间复杂度
o(h)=o(log2n)