二叉查詢樹(二叉排序樹)
二叉排序樹的建立,查詢,刪除節點的操作。
#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;
}
///查詢最小關鍵字,空樹的時候返回NULL
node* searchMin(node *root)
{
if(root==NULL)
return NULL;
if(root->left==NULL)
return root;
else
return searchMin(root->left);
}
///查詢最大關鍵字,空樹的時候返回NULL
node* 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;
}
}
///刪除結點,結點不存在返回0
int 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;
}
相關文章
- 二叉查詢樹【二叉排序樹】構建和查詢演算法 PHP 版排序演算法PHP
- 手擼二叉樹——二叉查詢樹二叉樹
- 二叉查詢樹
- 滿二叉樹、完全二叉樹、平衡二叉樹、二叉搜尋樹(二叉查詢樹)和最優二叉樹二叉樹
- 平衡二叉查詢樹:紅黑樹
- 排序二叉樹和平衡二叉樹排序二叉樹
- 5分鐘瞭解二叉樹之二叉查詢樹二叉樹
- 二叉查詢樹和笛卡爾樹
- 二叉樹路徑查詢二叉樹
- Amazing tree —— 二叉查詢樹
- Python 樹表查詢_千樹萬樹梨花開,忽如一夜春風來(二叉排序樹、平衡二叉樹)Python排序二叉樹
- 二叉查詢樹的插入刪除查詢
- js實現完全排序二叉樹、二叉搜尋樹JS排序二叉樹
- 第三章:查詢與排序(下)----------- 3.15基礎學習_樹、二叉樹、堆排序排序二叉樹
- 二叉查詢樹概念及實現
- 二叉排序樹 oj 2482排序
- js之排序二叉樹JS排序二叉樹
- 平衡二叉樹(AVL樹)和 二叉排序樹轉化為平衡二叉樹 及C語言實現二叉樹排序C語言
- 二叉查詢樹(查詢、插入、刪除)——C語言C語言
- JavaScript實現簡單二叉查詢樹JavaScript
- 【資料結構】查詢結構(二叉排序樹、ALV樹、雜湊技術雜湊表)資料結構排序
- 第 34 題:如何實現二叉查詢樹?
- 二叉樹(順序儲存二叉樹,線索化二叉樹)二叉樹
- 二叉排序樹BST及CRUD操作排序
- 二叉樹排序樹的建立,遍歷和刪除二叉樹排序
- 二叉樹 & 二叉查詢樹 ADT [資料結構與演算法分析 c 語言描述]二叉樹資料結構演算法
- 二叉樹 & 二叉查詢樹 ADT【資料結構與演算法分析 c 語言描述】二叉樹資料結構演算法
- 手擼二叉樹——AVL平衡二叉樹二叉樹
- 資料結構之樹結構概述(含滿二叉樹、完全二叉樹、平衡二叉樹、二叉搜尋樹、紅黑樹、B-樹、B+樹、B*樹)資料結構二叉樹
- 【Algorithm&DataStructure】二叉查詢樹(BST)的遍歷GoASTStruct
- 二叉樹二叉樹
- 使用javascript實現排序二叉樹(2)JavaScript排序二叉樹
- 使用javascript實現排序二叉樹(1)JavaScript排序二叉樹
- Java-二叉排序樹的刪除Java排序
- 【LeetCode-二叉樹】二叉樹前序遍歷LeetCode二叉樹
- 判斷二叉樹是否為滿二叉樹二叉樹
- 資料結構中的樹(二叉樹、二叉搜尋樹、AVL樹)資料結構二叉樹
- [譯] GopherCon 2018:揭祕二叉查詢樹演算法Go演算法
- 使用JS去實現一個BST(二叉查詢樹)JS