`
gogole_09
  • 浏览: 206051 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

数据结构与算法分析 -- 二叉查找树的实现以及一些常用操作

阅读更多

   二叉树的一个重要应用在于它们可以在查找中使用。

 

   今天来记录一下二叉查找树的学习心得;

 

   首先来看看,什么是二叉查找树?

   简单的说,它有一个性质。 既

   对于X节点来说,

                       它的左子树中的所有项都小于X的项,

                       它的右子树中的所有项都大于X的项。

    如图3

  

  下面我们用代码来实现一个简单的二叉查找树:

   代码如下:

 

package com.base.tree;

public class BinartSearchTree {
	public static void main(String[] args) {
		BinaryTree root=new BinaryTree();
		BinaryTree.TreeNode t=new BinaryTree.TreeNode(6);
		BinaryTree.TreeNode t2=new BinaryTree.TreeNode(2);
		BinaryTree.TreeNode t3=new BinaryTree.TreeNode(1);
		BinaryTree.TreeNode t4=new BinaryTree.TreeNode(5);
		BinaryTree.TreeNode t5=new BinaryTree.TreeNode(3);
		BinaryTree.TreeNode t6=new BinaryTree.TreeNode(4);
		BinaryTree.TreeNode t7=new BinaryTree.TreeNode(8);
		t.setLeft(t2);
		t.setRight(t7);
		t2.setLeft(t3);
		t2.setRight(t4);
		t4.setLeft(t5);
		t5.setRight(t6);
		root.setRoot(t);
		/*=================构造树,如图2-1=================*/

		root.remove(2);
		root.printTree();
	}
}


/**
 * 二叉查找树的性质:对于X节点,左边子树的所有项都小于X节点的项,右边子树的所有项都大于X节点的项。
 * @author google
 *
 */
class BinaryTree{
	private TreeNode root;
	
	public void setRoot(TreeNode root) {
		this.root = root;
	}

	public BinaryTree(){
		root=null;
	}
	
	public void makeEmpty(){
		root=null;
	}
	
	public boolean isEmpty(){
		return root==null;
	}
	
	public boolean contains(int data){
		return contains(data,root);
	}
	
	public int findMin(){
		if(isEmpty()) return -1;
		return findMin(root).data;
	}
	
	public int findMax(){
		if(isEmpty())return -1;
		return findMax(root).data;
	}
	
	public void insert(int data){
		root=insert(data, root);
	}
	
	public void remove(int data){
		root=remove(data,root);
	}
	
	public void printTree(){
		if(isEmpty())
			System.out.println("Empty Tree……");
		else
			printTree(root);
	}
	
	/**
	 * 打印树
	 * @param t
	 */
	private void printTree(TreeNode t){
		if(t!=null){
			printTree(t.left);
			System.out.println(t.data);
			printTree(t.right);	
		}
	}
	
	/**
	 * 在字树中查找与元素
	 * 
	 * @param x
	 * @param node
	 * @return
	 */
	private boolean contains(int x,TreeNode t){
		if(t==null)return false;
		if(x>t.data){
			return contains(x,t.right);
		}if(x<t.data){
			return contains(x,t.left);
		}else{
			return true;
		}
	}
	
	
	/**
	 * 删除节点,需要考虑需要删除节点的情况如下:
	 * 1.当需要删除的是一片树叶,即可立刻删除
	 * 2.有一个节点: 可以在其父节点调整链的指向,绕过该节点被删除。 图1
	 * 3.当有两个儿子节点时:
	 * 用右子树中最小数据代替该节点数据,并递归删除那个节点。       图2-2
	 * @param data
	 * @param t
	 * @return
	 */
	private TreeNode remove(int data,TreeNode t){
		if(t==null)return t;
		if(data>t.data){
			t.right=remove(data,t.right);
		}else if(data<t.data){
			t.left=remove(data,t.left);
		}else if(t.left!=null&&t.right!=null){
			//处理需要删除的节点有2个节点的情况
			//
			t.data=findMin(t.right).data;
			t.right=remove(t.data,t.right);
		}else{
			t=(t.left!=null)?t.left:t.right;
		}
		return t;
			
	}
	
	/**
	 * 将x插入到子树中
	 * @param data
	 * @param t
	 * @return
	 */
	private TreeNode insert(int data,TreeNode t){
		if(t==null)return new TreeNode(data,null,null);
		
		//比较大小, 将新建一个节点后,重新构造树
		if(data>t.data){
			t.right=insert(data,t.right);
		}else if(data<t.data){
			t.left=insert(data,t.left);
		}
		return t;
	}
	
	/**
	 * 查找最小元素, 从根开始,一路向左子树查找 (递归实现)
	 * @param t
	 * @return
	 */
	private TreeNode findMin(TreeNode t){
		if(t==null)return null;
		if(t.left==null)
			return t;
		return findMin(t.left);
	}
	
	
	/**
	 * 查找最大元素, 从根开始,一路向右子树查找 (非递归实现)
	 * @param t
	 * @return
	 */
	private TreeNode findMax(TreeNode t){
		if(t!=null)
			while(t.right!=null)
				t=t.right;
		return t;
	}


	/**
	 * 树节点类
	 * @author google
	 *
	 */
	public static class TreeNode{
		private int data;
		private TreeNode left;
		private TreeNode right;
		public TreeNode(){}
		public TreeNode(int data){
			this.data=data;
		}
		public TreeNode(int data,TreeNode left,TreeNode right){
			this.data=data;
			this.left=left;
			this.right=right;
		}
		public int getData() {
			return data;
		}
		public void setData(int data) {
			this.data = data;
		}
		public TreeNode getLeft() {
			return left;
		}
		public void setLeft(TreeNode left) {
			this.left = left;
		}
		public TreeNode getRight() {
			return right;
		}
		public void setRight(TreeNode right) {
			this.right = right;
		}
	}
}

 

 其中的remove方法可能理解相对要难一点,下面附上图片,让其原理一目了然。

 

  • 大小: 14 KB
  • 大小: 29.7 KB
分享到:
评论

相关推荐

    数据结构-用户登录实验-二叉查找树AVL树实现

    实验报告可能会详细解释这些操作的步骤,包括如何构建二叉查找树,如何实现AVL树的旋转算法,以及如何在实际应用中使用这些数据结构。此外,报告可能还会包含实验结果的分析,比如不同操作的运行时间比较,以及不...

    数据结构实验--基于二叉排序树的商品查询系统

    在数据结构领域,二叉排序树是一种非常重要的数据结构,它能够有效地支持查找、插入和删除等操作。本实验是关于基于二叉排序树的商品信息查询系统的设计与实现,主要目标是让学生深入理解并熟练运用二叉排序树的相关...

    数据结构实验之二叉排序树

    总结来说,"数据结构实验之二叉排序树"是一个实践性的学习项目,旨在通过动手实现二叉排序树的查找、插入和删除操作,来巩固和加深对数据结构理论知识的理解。在这个过程中,学生将学习到如何使用MFC来构建交互式...

    综合查找算法(顺序查找、折半查找、二叉排序树、哈希表)-数据结构课程设计

    本文将详细探讨四种常见的查找算法:顺序查找、折半查找、二叉排序树查找以及哈希表查找,并结合提供的"综合查找算法"课程设计项目,解析其在实际应用中的特点和优势。 **顺序查找**是最基础的查找算法,适用于任何...

    二叉查找树练习

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

    LUT算法与数据结构课程设计---递归替换和二叉排列树

    文档部分则可能涵盖了这些概念的理论介绍、算法分析以及实现细节。 为了进一步提升对这两个概念的理解,你可以通过以下几个步骤学习: 1. 学习递归的基本原理和如何避免递归陷阱。 2. 掌握二叉树的性质,特别是二叉...

    数据结构与算法设计课程设计-二叉排序树与平衡二叉树.docx

    在计算机科学领域,数据结构与算法设计是至关重要的部分,它们直接影响到程序的效率和性能。本课程设计主要探讨了两种特殊类型的二叉树:二叉排序树和平衡二叉树,尤其是AVL树,这些都是在数据存储和检索中常用的...

    数据结构与算法分析_C++语言描述(第2版)_Larry Nyhoff

    《数据结构与算法分析_C++语言描述(第2版)》是Larry Nyhoff撰写的一本经典教材,专注于探讨数据结构和算法的理论及其在C++编程语言中的实现。这本书不仅适合初学者,也对有一定经验的程序员有很高的参考价值。在...

    算法-理论基础- 查找- 二叉排序树(包含源程序).rar

    二叉排序树,又称二叉查找树或二叉搜索树,是计算机科学中一种非常重要的数据结构,主要用于高效地进行查找、插入和删除操作。它具有以下特性:对于任意一个节点,其左子树中的所有节点的值都小于该节点的值,而右子...

    数据结构之二叉排序树的生成

    二叉排序树,又称二叉查找树或二叉搜索树,是一种特殊的数据结构,它具有以下特性:对于树中的任意节点,其左子树中的所有节点的值都小于该节点的值,而右子树中所有节点的值都大于该节点的值。这种特性使得在二叉...

    数据结构二叉排序树的源代码

    根据给定的信息,我们可以分析出该段代码主要实现了二叉排序树的基本操作,包括创建、插入元素、查找元素以及中序遍历等。下面将详细解释这些知识点。 ### 数据结构:二叉排序树 二叉排序树(Binary Search Tree, ...

    数据结构与算法分析-c语言描述

    数据结构与算法分析是计算机科学中的核心领域,它关乎如何高效地存储、组织和操作数据。C语言作为底层且性能强大的编程语言,是理解和实现这些概念的理想工具。在这本名为“数据结构与算法分析——C语言描述”的资料...

    数据结构与算法分析-------

    ### 数据结构与算法分析 #### 书目简介与特点 《数据结构与算法分析》是一本专注于使用Java语言介绍数据结构和算法的经典教材。作者Robert Lafore以轻松幽默的方式介绍了如何利用数据结构解决实际问题,这使得本书...

    数据结构与算法分析-java语言描述(第二版)

    2. **树形结构**:树和二叉树的概念,以及它们在查找和排序操作中的应用,例如二叉搜索树、AVL树、堆等。 3. **图结构**:图的表示方法,包括邻接矩阵和邻接表,以及图的遍历算法,如深度优先搜索(DFS)和广度优先...

    C语言版数据结构与算法分析-严蔚敏经典视频教程

    01-001数据结构的概念和基本术语、抽象数据类型的表示与实现 01-002算法设计的要求、算法效率的度量 02-001线性表的类型定义 02-002线性表的顺序表示与实现、线性表的基本操作 02-003单链表的创建与操作、加工型...

    数据结构二叉排序树及其操作实验报告

    二叉排序树(Binary Sort Tree,BST),也称为二叉查找树或有序二叉树,是一种特殊类型的二叉树,其每个节点的左子树只包含比其小的元素,右子树包含比其大的元素,且整个树保持自平衡。在本实验报告中,我们将深入...

    C++数据结构与算法 (第4版)

    通过以上内容可以看出,《C++数据结构与算法(第4版)》这本书旨在全面介绍数据结构的基本概念、常用的数据结构类型、典型排序和查找算法,以及算法设计与分析的方法和技术。这些知识点对于学习计算机科学和编程语言...

    数据结构与算法分析-Java语言版

    数据结构与算法分析是计算机科学中的核心课程,它关乎如何高效地存储和处理数据,以及设计和实现高效的算法。在Java语言环境下,这门课程更显得尤为重要,因为Java以其跨平台特性和强大的类库支持,成为了许多开发者...

    湖南交通工程学院2022年专升本数据结构与算法分析---考试大纲专升本软件考试大纲.docx

    数据结构与算法分析考试大纲 数据结构与算法分析是软件工程专业的核心课程,旨在培养学生对数据结构和算法的理解和应用能力。本考试大纲涵盖了数据结构和算法分析的基本概念、逻辑结构、存储结构、算法设计和分析、...

Global site tag (gtag.js) - Google Analytics