二叉查找树(二叉排序树)
来源:互联网 发布:最好的网络直播 编辑:程序博客网 时间:2024/06/08 09:06
二叉排序树的建立,查找,删除节点的操作。
#include <stdio.h>#include <iostream>#include <algorithm>#include <string.h>using namespace std;struct node{ int key;///结点值 node *left; node *right; node *parent;///指向父亲结点的指针};///递归中序遍历排序二叉树void show(node *p){ if (p==NULL) return; if (p->left != NULL) show(p->left); printf("%d ",p->key); if (p->right != NULL) show(p->right);}///插入结点void inseart(node ** root,int key){ node *p=new node; // node1 p=(node1)malloc(sizeof(node)); p->key=key; p->left=p->right=p->parent=NULL; ///空树时作为根结点 if((*root)==NULL) { *root=p; return; } ///插入到*root的左孩子 // printf("%d\n",root->key); if((*root)->left==NULL&&(*root)->key>key) { p->parent=(*root); (*root)->left=p; return; } ///插入到*root的右孩子 if((*root)->right==NULL&&(*root)->key<key) { p->parent=(*root); (*root)->right=p; return; } if((*root)->key>key) inseart(&(*root)->left,key); else if((*root)->key<key) inseart(&(*root)->right,key); else return;}///创建二叉排序树void create(node **root,int *a,int length){ for(int i=0; i<length; i++) inseart(root,a[i]);}///查找二叉排序树node* search(node *root,int key){ if(root==NULL) return NULL; if(key>root->key) return search(root->right,key); else if(key<root->key) return search(root->left,key); else return root;}///查找最小关键字,空树的时候返回NULLnode* searchMin(node *root){ if(root==NULL) return NULL; if(root->left==NULL) return root; else return searchMin(root->left);}///查找最大关键字,空树的时候返回NULLnode* searchMax(node *root){ if(root=NULL) return NULL; if(root->right==NULL) return root; else return searchMax(root->right);}///查找一个结点的前驱(排序二叉树中第一个比它的值小的结点)node* searchPredecessor(node *p){ /// 空树 if(p==NULL) return p; ///有左子树,左子树中最大的那个 if(p->left) return searchMax(p->left); ///无左子树,查找某个结点的右子树,遍历完了 else { if(p->parent==NULL) reutrn NULL; ///向上寻找前驱 while(p) { if(p->parent->right==p) break; p=p->parent; } return p->parent; }}///查找每个结点的后继(排序二叉树中第一个比它的值大的结点)node* searchSuccessor(node* p){ ///空树 if(p==NULL) return p; ///有右子树,右子树中最小的那个 if(p->right) return searchMin(p->right); ///无右子树,查找某个结点的左子树遍历完了 else { if(p->parent==NULL) return NULL; while(p) { if(p->parent->left==p) break; p=p->parent; } return p->parent; }}///删除结点,结点不存在返回0int delete_node(node ** root,int key){ node* q; node *p=search(*root,key); int temp; if(!p) return 0; ///1.被删结点是叶子结点,直接删除 if(p->left==NULL&&p->right==NULL) { if(p->parent==NULL) { delete(p); (*root)=NULL; } else { if(p->parent->left==p) p->parent->left=NULL; else p->parent->right=NULL; delete(p); } } ///2被删除的结点只有左子树 else if(p->left&&!(p->right)) { p->left->parent=p->right; ///如果删除的是父结点,要改变父结点指针 if(p->parent==NULL) *root=p->left; ///删除的父亲结点的左孩子 else if(p->parent->left==p) p->parent->left=p->left; ///删除的父亲结点的右孩子 else p->parent->right=p->left; delete(p); } ///3被删除的结点只有右孩子 else if(p->right&&!(p->left)) { p->right->parent=p->parent; ///如果删除的是父结点,要改变父结点指针 if(p->parent==NULL) *root=p->right; ///删除的父亲结点的左孩子 else if(p->parent->left==p) p->parent->left=p->right; ///删除的父亲结点的右孩子 else p->parent->right=p->right; delete(p); } ///4被删除的结点既有左孩子又有右孩子 else { q=searchSuccessor(p); temp=q->key; delete_node(root,q->key); p->key=temp; } return 1;}int main(){ int a[11]= {15,6,18,3,7,17,20,2,4,10,9}; node *root = NULL; create(&root,a,11); ///遍历 show(root); ///查找 printf("%d\n",search(root,17)->key); ///删除 for(int i=0; i<11; i++) { printf("%d\n",a[i]); delete_node(&root,a[i]); show(root); printf("\n"); } return 0;}
0 0
- 二叉排序树(二叉查找树)
- 二叉排序树(二叉查找树)
- 二叉查找树(二叉排序树)
- 二叉排序树(二叉查找树)
- 二叉查找树(二叉排序树)BST解析
- 二叉查找树(二叉排序树)Java实现
- C++ 二叉排序树BST(二叉查找树)
- 查找 二(二叉排序树、平衡二叉树、)
- 二叉树、二叉排序树(二叉查找树)、平衡二叉树
- 平衡树、平衡二叉查找树、二叉排序树(查找树)
- [BinaryTree] 二叉搜索树(二叉查找树、二叉排序树)
- 数据结构(22)--动态查找之二叉排序树(二叉查找树)
- 二叉搜索树 二叉查找树 二叉排序树
- 二叉树、满二叉树、完全二叉树、二叉排序树(二叉查找树)、平衡二叉树
- 二叉搜索树(二叉排序树,二叉查找树,二叉检索树)的查找,插入,删除
- 二叉排序树(二叉搜索、查找树)(BST树)
- 二叉查找树(二叉排序树)操作大全C++实现
- 数据结构之二叉排序树或者二叉查找树(java版)
- Hibernate中的left outer join
- 前缀、中缀、后缀表达式
- 将32位代码向64位平台移植的注意事项
- 基于ASP.NET的网站发布、打包和安装
- Apache Shiro 使用手册(二)Shiro 认证
- 二叉查找树(二叉排序树)
- 使用WindowManager添加自定义视图
- 建立链表快速查找中间结点的值并显示
- Linux互斥与同步应用(一):posix线程及线程间互斥
- 给hadoop新手的一封信:Hadoop入门自学及对就业的帮助
- ceph存储 ceph集群测试工具mdtest
- 快排
- 记录给自己的东西
- 基于Spring和CXF的webservice开发环境搭建