二叉搜索树实现

这只是作为我学习的笔记

  1 #ifndef BINARYTREE_H_
  2 #define BINARYTREE_H_
  3 #include<iostream>
  4 typedef int Item;
  5 struct Btreenode
  6     {
  7         Item data;
  8         Btreenode *left,*right;
  9     };
 10 class BinaryTree
 11 {
 12 public:
 13     Btreenode * BST;//树的根节点
 14     BinaryTree(){BST=NULL;}
 15     bool Insert(const Item & x);//合适的位置插入节点x
 16     bool Delete(const Item & x);//删除并调整树
 17     void create(const Item * x, int n);//创建n个树节点,调用insert
 18     bool find(Btreenode & p, const Item & x)const;//查找等于x的树节点并赋给p
 19 };
 20 #endif // !BinaryTree_H_
 21
 22
 23 #include"BinaryTree.h"
 24
 25 void BinaryTree::create(const Item * x, int n)
 26 {
 27     for(int i=0;i<=n-1;i++)
 28     {
 29         Insert(x[i]);
 30     }
 31 }
 32 bool BinaryTree::Insert(const Item & x)//肯定是要放在合适的叶子节点位置
 33 {
 34     if(BST==NULL)//根指针
 35     {
 36         Btreenode * p=new Btreenode;
 37         p->data=x;
 38         p->left=p->right=0;
 39         BST=p;
 40         return true;
 41     }
 42     Btreenode *p=BST,*q=BST;
 43     int f=0;
 44     while(p!=NULL)//非递归查找叶子节点位置
 45     {
 46         if(p->data>x)
 47             {q=p;f=1;p=p->left;}
 48         else if(p->data<x)
 49             {q=p;f=2;p=p->right;}
 50         else
 51             return false;   //如果插入相等的数返回false
 52     }
 53     if(p==NULL)
 54     {
 55         Btreenode * temp=new Btreenode;
 56         temp->data=x;
 57         temp->left=temp->right=NULL;//把叶子节点的后继孩子置为NULL指针
 58         if(f==1)q->left=temp;
 59         else if(f==2)q->right=temp;
 60         return true;
 61     }
 62     else return false;
 63 }
 64
 65 bool BinaryTree::find(Btreenode & p,const Item & x)const
 66 {
 67     if(BST==NULL)
 68         return false;
 69     else
 70     {
 71         Btreenode * temp=BST;
 72         while(temp!=NULL)//非递归实现,递归实现
 73         {
 74             if(temp->data==x)
 75             {
 76                 p=*temp;   //返回所指向的节点内容
 77                 return true;
 78             }
 79             else if(temp->data>x)
 80                 temp=temp->left;
 81             else
 82                 temp=temp->right;
 83         }
 84         return false;
 85     }
 86 }
 87
 88
 89
 90 bool BinaryTree::Delete(const Item & x)
 91 {
 92     if(!BST)
 93         return false;
 94     Btreenode * s=NULL;
 95     Btreenode * t= BST;
 96     while(t!=NULL)   //定位 x的位置,其父节点
 97     {
 98         if(t->data==x)
 99             break;
100         else if(t->data>x)
101         {s=t;t=t->left;}//s指向t的父节点
102         else
103         {s=t;t=t->right;}
104     }
105     if(t==NULL) return false;//不存在该节点,删不掉
106     if(t->left==NULL && t->right==NULL)//t是叶节点,可以直接删掉置父节点孩子为NULL
107     {
108         if(t==BST)  //若t是根节点,单独考虑 s=NULL
109             BST=NULL;
110         else if(t==s->left)
111             s->left=NULL;
112         else
113             s->right=NULL;
114         delete t;
115     }
116
117     else if(t->left==NULL || t->right==NULL)//左孩子或右孩子为空,把非空的后继节点支脉给其父节点s
118     {
119         if(t==BST)
120         {
121             if(t->left==NULL)BST=BST->right;
122             else BST=BST->left;
123             delete t;
124         }
125         else
126         {
127             if(t==s->left && t->left!=NULL)
128                 s->left=t->left;
129             else if(t==s->left && t->right!=NULL)
130                 s->left=t->right;
131             else if(t==s->right && t->left!=NULL)
132                 s->right=t->left;
133             else if(t==s->right && t->right!=NULL)
134                 s->right=t->right;
135         }
136     }
137     else if(t->left!=NULL && t->right!=NULL)//如果都非空
138     //法1:把左支脉给s节点相应缺失的孩子,右支脉放在t->left最大的位置(一直找右孩子,直至右孩子)
139     //法2:用t->left后续最大节点代替t
140     {
141         if(s->left==t)//t指向的是s的左孩子
142             s->left=t->left;
143         else
144             s->right=t->left;
145         Btreenode * q=t->left;
146         Btreenode * p=t;
147         while(q!=NULL)
148         {
149             p=q;q=q->right; //q是t->left最大的位置.p没有右孩子
150         }
151         p->right=t->right;
152         delete t;
153     }
154     return false;
155 }
156
157
158 #include<iostream>
159 #include"BinaryTree.h"
160 typedef BinaryTree T;
161
162 void InOrder(Btreenode * r)//二叉查找树排序
163 {
164     if(r!=NULL)
165     {
166         InOrder(r->left);
167         std::cout<<r->data<<" ";
168         InOrder(r->right);
169     }
170     return;
171 }
172
173 int  main()
174 {
175     using namespace std;
176     T mr;
177     int n = 11;
178     Item  a[]={66,80,3,10,88,98,15,77,25,65,35};
179     mr.create(a, n);
180     InOrder(mr.BST);
181     Btreenode p;
182     mr.find(p, 10);
183     cout<< p.data<<endl;
184     mr.Delete(65);
185     InOrder(mr.BST);
186
187     system("pause");
188     return 0;
189 }

时间: 2024-11-03 03:47:04

二叉搜索树实现的相关文章

用JS实现二叉搜索树

二叉树的节点最多只能有两个子节点,一个左侧子节点,一个右侧子节点. 二叉搜索树(BST),是二叉树的一种,但只允许在左侧节点存储比父节点小的值,在右侧节点存储比父节点大或等于父节点的值. 1.创建BST 1.1创建BST类 首先申明BST类的基本结构 function BinarySearchTree() { var Node = function(key){ this.key = key; this.left = null; this.right = null; }; var root = n

538. Convert BST to Greater Tree 二叉搜索树转换为更大树

Given a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the original BST is changed to the original key plus sum of all keys greater than the original key in BST. Example: Input: The root of a Binary Search Tree like thi

二叉搜索树

#include<stdio.h> #include<iostream> #include<math.h> #include<stdlib.h> using namespace std; struct TreeNode { TreeNode* p; TreeNode* l; TreeNode* r; int key; TreeNode() { p = 0; l = 0; r = 0; key = -1; } }; const int RANDMOD = 30

04-树4 是否同一棵二叉搜索树

给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果.于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树. 输入格式: 输入包含若干组测试数据.每组数据的第1行给出两个正整数N (≤10)和L,分别是每个序列插入元素的个数和需要检查的序列个数.第2行给出N个以空格分隔的正整数,作为初始插入序列.最后L行,每行给出N个插入的元素,属于

二叉搜索树建立、插入、删除、前继节点、后继节点之c++实现

一.前言 一直以来,都对树有关的东西望而却步.以前每次说要看一看,都因为惰性,时间就那么荒废掉了.今天下个决心,决定好好的数据结构中的东西看一下.不知道看这篇文章的你,是不是和我有同样的感受,空有一颗努力的心,却迟迟没有付出行动.如果是的话,如果也想好好的把树的知识巩固一下的话,就让我们一起好好儿地把知识点过一遍吧.本文争取让看完的每一个没有基础的同学,都能有所收获.在正文开始前,先给自己加个油.加油(^ω^) 二.二叉搜索树的定义 二叉搜索树是指,对于某一个节点而言,它左边的节点都小于或等于它

剑指offer:二叉搜索树与双向链表

1.题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 2.解题思路: (1)将左子树构造成双向链表,并返回链表头节点: (2)定位左子树双链表的尾节点: (3)如果左子树链表不为空,将当前root连缀其链尾: (4)将右子树构造出双向链表,并返回链表头节点: (5)如果右子树链表不为空,将当前root连缀其表头: (6)根据左子树链表是否为空,确定返回的节点. 3.JavaScript实现: function Conv

数据结构——二叉搜索树、B树、B-树

数据结构——二叉搜索树.B树.B-树 1. 综述 二叉排序树(Binary Sort Tree),又叫二叉查找树(Binary Search Tree),也叫二叉排序树. 二叉搜索树满足以下性质: 1. 若根节点左子树不为空,则左子树上的所有节点均小于根节点: 2. 若根节点右子树不为空,则右子树上的所有节点均大于根节点: 3. 其左右子树也是二叉搜索树(递归定义): 4. 没有键值相等的点. B树就是B-树.B树/B-树英文叫B-Tree,可能被不小心翻译成了B-树.

PAT天梯赛练习题 L3-010. 是否完全二叉搜索树(完全二叉树的判断)

L3-010. 是否完全二叉搜索树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果. 输入格式: 输入第一行给出一个不超过20的正整数N:第二行给出N个互不相同的正整数,其间以空格分隔. 输出格式: 将输入的N个正整数顺序插入一个初始为空的二叉搜索树.在第一行中输出结果树的层序

Java数据结构之二叉搜索树

Java数据结构之二叉搜索树 1.二叉搜索树组成 二叉搜索树又称为二叉排序树,它或者是一颗空树,或者是一颗具有如下特性的非空二叉树,需要满足一下三个条件: (1)若它的左子树非空,则左子树上所有结点的关键字均小于根结点的关键字: (2)若它的右子树非空,则右子树上所有结点的关键字均大于(可以等于)根结点的关键字. (3)左子树右子树本身又各是一颗二叉搜索树 在算法描述中,均以结点值的比较来代表其关键字的比较,因为若结点的值为类类型时,该类必须实现系统提供的java.lang.comparable

二叉搜索树与双向链表

void convertNode(BSTreeNode *root, BSTreeNode ** pLastNodeInList) { if(!root) return ; if(root->left) { convertNode(root->left, pLastNodeInList); } root->left = *pLastNodeInList; if(*pLastNodeInList != NULL) (*pLastNodeInList)->right = root; *