二叉搜索树学习笔记 Java实现

来源:互联网 发布:蛮荒之怒2进阶数据 编辑:程序博客网 时间:2024/05/11 06:02

二叉搜索树(二叉排序树)O(log2n);

设结点由关键字值表征,假定所有结点的关键字值各不相同,二叉搜索树或是一棵空二叉树,或具有下列性质:

(1)若左孩子不空,则左子树上所有结点的关键字值均小于根结点的关键字值;

(2)若右孩子不空,则右子树上所有结点的关键字值均大于根结点的关键字值;

(3)左、右子树也分别为二叉搜索树。

若以中序遍历一棵二叉搜索树,将得到一个以关键字值递增的有序序列。

import java.util.Scanner;public class BSTree {private BSTree rchild, lchild;private int data;public BSTree(){}public BSTree(int data) {this.data = data;}//创建二叉搜索树@SuppressWarnings("resource")public BSTree createBSTree() {BSTree root = null;Scanner in = new Scanner(System.in);int m = in.nextInt();if (m > 0) {root = new BSTree(m);root.lchild = createBSTree();root.rchild = createBSTree();}return root;}//二叉搜索树的搜索public BSTree search(int x,BSTree root){BSTree p=root;while(p!=null){if(x<p.data){p=p.lchild;}else if(x>p.data){p=p.rchild;}else{System.out.println("Success search!");return p;}}System.out.println("No present!");return null;}//二叉搜索树的插入public void insert(int x,BSTree root){BSTree p=root,q=null;while(p!=null){q=p;if(x<p.data){p=p.lchild;}else if(x>p.data){p=p.rchild;}else{System.out.println("Duplicate!");}}p=new BSTree(x);if(root==null){root=p;}else if(x<q.data){q.lchild=p;}else{q.rchild=p;}System.out.println("Success insert!");}//二叉搜索树的删除/* * (1)若结点p有两棵非空子树,需搜索结点p的中序遍历次序下的直接后继结点,设为结点s。将s的值复制到p中,称为替代。 * (因为结点s最多只有一棵非空子树,这样问题转化为“被删除的结点最多只有一棵非空子树”的情形) * (2)若结点p只有一棵非空子树或p是叶子结点,以结点p的唯一孩子(设为结点c)或(c=null)取代p。 * (3)若被删除的结点p是根结点,则删除后,结点c成为新的根;否则,若p是其双亲q的左孩子,则结点c也应该成为q的左孩子, * 不然,c成为q的右孩子。 */public void remove(int x,BSTree root){BSTree c,s,r,p=root,q=null;while(p!=null&&p.data!=x){q=p;if(x<p.data){p=p.lchild;}else{p=p.rchild;}}if(p==null){System.out.println("No present!");}x=p.data;if(p.lchild!=null&&p.rchild!=null){s=p.rchild;r=p;while(s.lchild!=null){r=s;s=s.lchild;}p.data=s.data;p=s;q=r;}//寻找替代结点if(p.lchild!=null){c=p.lchild;}else{c=p.rchild;}//实现删除操作if(p==root){root=c;}else if(p==q.lchild){q.lchild=c;}else{q.rchild=c;}System.out.println("Success delete!");}public void printBSTree(BSTree root) {if (root == null)return;printBSTree(root.lchild);System.out.print(root.data+" ");printBSTree(root.rchild);}}

 参考:《数据结构——C++语言描述》

0 0