`

二叉查找树

    博客分类:
  • Java
阅读更多
二叉排序树(Binary Sort Tree)又称二叉查找树(Binary Search Tree),亦称二叉搜索树。 它或者是一棵空树;或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左、右子树也分别为二叉排序树;

增加 查找 删除 序列化
import java.util.ArrayList;
import java.util.List;


public class BinsearTree {

	private static Node rootNode = null ;

	private static List<Node> nodelist = new ArrayList<Node>();

	private class Node{
		private int key;
		private Node LeftchildNode;
		private Node rightchildNode;
		private Node parentNode;
		Node(int key,Node leftchildNode,Node rightNode,Node parentNode){
			this.key = key;
			this.LeftchildNode = leftchildNode;
			this.rightchildNode = rightNode;
			this.parentNode = parentNode;
		}
		public int getKey(){
			return key;
		}

	}

	public Boolean isEmpty(){
		if(rootNode == null){
			return true;
		}else{
			return false;
		}
	}

	public void insert(int k){
		Node parentNode = null;
		Node newNode = new Node(k, null, null, null);
		Node pNode = rootNode;
		if(rootNode ==null){
			rootNode = newNode;
			return;
		}
		while(pNode != null){
			parentNode = pNode;
			if(k<pNode.key){
				pNode = pNode.LeftchildNode;
			}else if(k>pNode.key){
				pNode = pNode.rightchildNode;
			}else{
				return;
			}
		}
		if(k<parentNode.key){
			parentNode.LeftchildNode = newNode;
			newNode.parentNode = parentNode;
		}else{
			parentNode.rightchildNode = newNode;
			newNode.parentNode = parentNode;
		}
	}

	public static void main(String[] args) {
		BinsearTree nodetreeBinsearTree = new BinsearTree();
		System.out.println("查找树是否为空? " + (nodetreeBinsearTree.isEmpty() ? "是" : "否"));
		int[] src = {9,1,32,4,2,34,5,44,23,11,87,94,31};
		for(int k : src){
			nodetreeBinsearTree.insert(k);
		}
		System.out.println("查找树是否为空? " + (nodetreeBinsearTree.isEmpty() ? "是" : "否"));
		System.out.println("最小关键字为:" + minnode(rootNode).getKey());
		System.out.println("最大关键字为:" + maxnode(rootNode).getKey());
		tranver(nodetreeBinsearTree);
		Node serNode = findnode(23);
		if(serNode == null){
			System.out.println("不含有该结点");
		}else{
			delate(serNode);
		}
		tranver(nodetreeBinsearTree);
	}

	private static void delate(Node node) {
		if(rootNode == null){
			System.out.println("树为空");
			return;
		}
		if(node==rootNode){
			rootNode = null;
			System.out.println("该节点是树的根节点,删除树成功!");
		}
		if(node.LeftchildNode==null && node.rightchildNode ==null){
			System.out.println("该节点无子节点");
			if(node == node.parentNode.LeftchildNode){
				node.parentNode.LeftchildNode = null;
			}else{
				node.parentNode.rightchildNode = null;
			}
			System.out.println("删除成功!");
			return;
		}
		if(node.rightchildNode==null){
			System.out.println("该节点有一个左节点");
			if(node == node.parentNode.LeftchildNode){
				node.parentNode.LeftchildNode = node.LeftchildNode;
			}else{
				node.parentNode.rightchildNode = node.LeftchildNode;
			}
			System.out.println("删除成功!");
			return;
		}
		if(node.LeftchildNode==null){
			System.out.println("该节点有一个右节点");
			if(node == node.parentNode.LeftchildNode){
				node.parentNode.LeftchildNode = node.rightchildNode;
			}else{
				node.parentNode.rightchildNode = node.rightchildNode;
			}
			System.out.println("删除成功!");
			return;
		}
		System.out.println("该节点有两个节点");
		Node node2 = maxnode(node.LeftchildNode);
		if(node == node.parentNode.LeftchildNode){
			node.parentNode.LeftchildNode = node2;
		}else{
			node.parentNode.rightchildNode = node2;
		}
		if(node2 != node.LeftchildNode){
			node2.parentNode.rightchildNode = null;
			node2.LeftchildNode = node.LeftchildNode;
			node.LeftchildNode.parentNode = node2.LeftchildNode;
		}
		node2.parentNode = node.parentNode;
		node2.rightchildNode = node.rightchildNode;
		node.rightchildNode.parentNode = node2.rightchildNode;
		System.out.println("删除成功!");
	}

	private static Node findnode(int key) {
		if(rootNode == null){
			System.out.println("树为空");
		}
		Node prodeNode = rootNode;
		while(prodeNode != null){
			if(key<prodeNode.key){
				prodeNode = prodeNode.LeftchildNode;
			}else if(key>prodeNode.key){
				prodeNode = prodeNode.rightchildNode;
			}else{
				break;
			}
		}
		if(prodeNode != null){
			return prodeNode;
		}else{
			return null;
		}
	}

	private static void tranver(BinsearTree tree) {
		inmidtranver();
		System.out.println("对树进行有序化:");
		for(Node node : nodelist){
			System.out.print(node.key+" ");
		}
		System.out.println();
	}

	private static void  inmidtranver(){
		if(nodelist.size()>0){
			nodelist.clear();
		}
		midtranver(rootNode);
	}

	private static void midtranver(Node rootNode){
		if(rootNode == null){
			return;
		}
		midtranver(rootNode.LeftchildNode);
		nodelist.add(rootNode);
		midtranver(rootNode.rightchildNode);
	}

	private static Node minnode(Node rootNode) {
		if(rootNode == null){
			System.out.println("树为空 ");
		}
		while(rootNode.LeftchildNode  !=null){
			rootNode = rootNode.LeftchildNode;
		}
		return rootNode;
	}

	private static Node maxnode(Node rootNode) {
		if(rootNode == null){
			System.out.println("树为空 ");
		}
		while(rootNode.rightchildNode  !=null){
			rootNode = rootNode.rightchildNode;
		}
		return rootNode;
	}


}
分享到:
评论

相关推荐

    二叉查找树 减治法——C++代码

    二叉查找树(Binary Search Tree,BST)是一种特殊的二叉树数据结构,它的每个节点都包含一个键(key)、一个关联的值、一个指向左子树的引用和一个指向右子树的引用。在二叉查找树中,对于任意节点,其左子树中的...

    二叉查找树C++实现

    二叉查找树(Binary Search Tree, BST)是一种基础但非常重要的数据结构,它在计算机科学中扮演着核心角色,尤其是在算法和数据结构的学习中。二叉查找树的主要特性是每个节点的左子树只包含小于该节点的元素,右子...

    二叉查找树练习

    二叉查找树(Binary Search Tree, BST)是一种特殊的数据结构,它在计算机科学中用于高效地存储和检索数据。在二叉查找树中,每个节点包含一个键(key)、一个关联的值、一个指向左子节点的引用以及一个指向右子节点...

    C++模板类二叉查找树的实现

    在C++编程中,二叉查找树(Binary Search Tree,简称BST)是一种常见的数据结构,它具有以下特性:对于任意节点,其左子树中的所有节点的值都小于该节点的值,右子树中所有节点的值都大于该节点的值。这种性质使得...

    二叉查找树实现简单的信息检索

    二叉查找树(Binary Search Tree,BST)是一种特殊类型的二叉树,它的每个节点都包含一个键(key)、一个关联的值、一个指向左子树的指针和一个指向右子树的指针。在二叉查找树中,每个节点的键都大于其左子树中的...

    二叉查找树c 源码

    二叉查找树(Binary Search Tree,BST)是一种特殊类型的二叉树,它的每个节点都包含一个键(key)、一个关联的值、一个指向左子树的引用和一个指向右子树的引用。在二叉查找树中,对于任意节点,其左子树中的所有...

    C++实现的最优二叉查找树

    用C++实现的最优二叉查找树,简单,明了,是数据结构里经典必学算法,初学者适用

    最优二叉查找树 动态规划法.cpp.rar

    最优二叉查找树(Optimal Binary Search Tree, OBST)是一种高效的检索数据结构,它根据键值分布的不同,自适应地调整树的形态以达到最小化查找时间的目的。在计算机科学中,动态规划(Dynamic Programming, DP)是...

    一种高效二叉查找树---红黑树

    ### 一种高效二叉查找树——红黑树 #### 一、引言 在计算机科学领域,二叉查找树(Binary Search Tree, BST)是一种非常重要的数据结构,它能够有效地实现查找、插入和删除等基本操作。然而,在某些情况下,普通的...

    最优二叉查找树

    标题:最优二叉查找树 描述:算法对最优二叉树的实现(课本上对最优二叉树的基本实现) 在计算机科学中,最优二叉查找树(Optimal Binary Search Tree,简称OBST)是一种特殊的二叉查找树,其设计目标是在平均情况...

    二叉查找树的C语言实现——插入,删除,查找

    二叉查找树(Binary Search Tree,BST)是一种特殊的二叉树数据结构,它具有以下特性:对于树中的每个节点,其左子树上的所有节点的值都小于该节点的值,而右子树上的所有节点的值都大于该节点的值。这样的特性使得...

    二叉查找树的实现

    1、 定义二叉查找树的类。 2、 实验验证如下算法的正确性、各种功能及指标: 1)实现二叉查找树结构; 2) 实现二叉查找树的查找、插入和删除等算法;

    c++实现二叉查找树

    ### C++ 实现二叉查找树 #### 一、引言 本文将详细介绍如何使用C++来实现一个二叉查找树(Binary Search Tree, BST),包括其基本操作:插入、删除、遍历等,并通过示例代码进行解释。二叉查找树是一种非常重要的数据...

    C++二叉查找树的实现

    ### 一、二叉查找树简介 二叉查找树是一种特殊的二叉树数据结构,它具有以下特性: 1. **左子树**中的所有节点值均小于其根节点的值。 2. **右子树**中的所有节点值均大于其根节点的值。 3. 左右子树也分别满足上述...

    二叉查找树完整C++代码

    二叉查找树(Binary Search Tree,BST)是一种特殊的二叉树结构,它的每个节点都包含一个键值(key)、一个指向左子树的指针和一个指向右子树的指针。在二叉查找树中,对于任意节点,其左子树中的所有节点的键值都...

    二叉查找树python二叉查找树源码

    二叉查找树(Binary Search Tree,BST),也称为二叉排序树,是一种特殊的二叉树数据结构。它的每个节点都包含一个键(key)、一个关联的值、一个指向左子节点的指针和一个指向右子节点的指针。在二叉查找树中,对于...

    二叉查找树的最大最小以及任意数查找

    二叉查找树(Binary Search Tree,BST),也称为二叉排序树,是一种特殊的二叉树数据结构,它的每个节点都包含一个键值、一个指向左子树的指针和一个指向右子树的指针。在二叉查找树中,对于任意节点,其左子树中的...

    二叉查找树的常用操作,含C++代码

    二叉查找树的常用操作,含C++代码,找工作的时候可以放在手机里看。

Global site tag (gtag.js) - Google Analytics