二叉树的一个重要应用在于它们可以在查找中使用。
今天来记录一下二叉查找树的学习心得;
首先来看看,什么是二叉查找树?
简单的说,它有一个性质。 既
对于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树的旋转算法,以及如何在实际应用中使用这些数据结构。此外,报告可能还会包含实验结果的分析,比如不同操作的运行时间比较,以及不...
在数据结构领域,二叉排序树是一种非常重要的数据结构,它能够有效地支持查找、插入和删除等操作。本实验是关于基于二叉排序树的商品信息查询系统的设计与实现,主要目标是让学生深入理解并熟练运用二叉排序树的相关...
总结来说,"数据结构实验之二叉排序树"是一个实践性的学习项目,旨在通过动手实现二叉排序树的查找、插入和删除操作,来巩固和加深对数据结构理论知识的理解。在这个过程中,学生将学习到如何使用MFC来构建交互式...
本文将详细探讨四种常见的查找算法:顺序查找、折半查找、二叉排序树查找以及哈希表查找,并结合提供的"综合查找算法"课程设计项目,解析其在实际应用中的特点和优势。 **顺序查找**是最基础的查找算法,适用于任何...
二叉查找树(Binary Search Tree, BST)是一种特殊的数据结构,它在计算机科学中用于高效地存储和检索数据。在二叉查找树中,每个节点包含一个键(key)、一个关联的值、一个指向左子节点的引用以及一个指向右子节点...
文档部分则可能涵盖了这些概念的理论介绍、算法分析以及实现细节。 为了进一步提升对这两个概念的理解,你可以通过以下几个步骤学习: 1. 学习递归的基本原理和如何避免递归陷阱。 2. 掌握二叉树的性质,特别是二叉...
在计算机科学领域,数据结构与算法设计是至关重要的部分,它们直接影响到程序的效率和性能。本课程设计主要探讨了两种特殊类型的二叉树:二叉排序树和平衡二叉树,尤其是AVL树,这些都是在数据存储和检索中常用的...
《数据结构与算法分析_C++语言描述(第2版)》是Larry Nyhoff撰写的一本经典教材,专注于探讨数据结构和算法的理论及其在C++编程语言中的实现。这本书不仅适合初学者,也对有一定经验的程序员有很高的参考价值。在...
二叉排序树,又称二叉查找树或二叉搜索树,是计算机科学中一种非常重要的数据结构,主要用于高效地进行查找、插入和删除操作。它具有以下特性:对于任意一个节点,其左子树中的所有节点的值都小于该节点的值,而右子...
二叉排序树,又称二叉查找树或二叉搜索树,是一种特殊的数据结构,它具有以下特性:对于树中的任意节点,其左子树中的所有节点的值都小于该节点的值,而右子树中所有节点的值都大于该节点的值。这种特性使得在二叉...
根据给定的信息,我们可以分析出该段代码主要实现了二叉排序树的基本操作,包括创建、插入元素、查找元素以及中序遍历等。下面将详细解释这些知识点。 ### 数据结构:二叉排序树 二叉排序树(Binary Search Tree, ...
数据结构与算法分析是计算机科学中的核心领域,它关乎如何高效地存储、组织和操作数据。C语言作为底层且性能强大的编程语言,是理解和实现这些概念的理想工具。在这本名为“数据结构与算法分析——C语言描述”的资料...
2. **树形结构**:树和二叉树的概念,以及它们在查找和排序操作中的应用,例如二叉搜索树、AVL树、堆等。 3. **图结构**:图的表示方法,包括邻接矩阵和邻接表,以及图的遍历算法,如深度优先搜索(DFS)和广度优先...
01-001数据结构的概念和基本术语、抽象数据类型的表示与实现 01-002算法设计的要求、算法效率的度量 02-001线性表的类型定义 02-002线性表的顺序表示与实现、线性表的基本操作 02-003单链表的创建与操作、加工型...
二叉排序树(Binary Sort Tree,BST),也称为二叉查找树或有序二叉树,是一种特殊类型的二叉树,其每个节点的左子树只包含比其小的元素,右子树包含比其大的元素,且整个树保持自平衡。在本实验报告中,我们将深入...
数据结构与算法分析是计算机科学中的核心课程,它关乎如何高效地存储和处理数据,以及设计和实现高效的算法。在Java语言环境下,这门课程更显得尤为重要,因为Java以其跨平台特性和强大的类库支持,成为了许多开发者...
数据结构与算法分析考试大纲 数据结构与算法分析是软件工程专业的核心课程,旨在培养学生对数据结构和算法的理解和应用能力。本考试大纲涵盖了数据结构和算法分析的基本概念、逻辑结构、存储结构、算法设计和分析、...
该考试大纲涵盖了数据结构与算法分析的基本概念、逻辑结构、存储结构、基本操作、算法设计、时间复杂度与空间复杂度分析等方面。 一、考试的基本要求 * 理解数据结构的基本概念,包括逻辑结构、物理结构、两者的...
二叉排序树(Binary Sort Tree,BST),也称为二叉查找树或二叉搜索树,是一种自平衡的二叉树数据结构,它在处理搜索、插入和删除操作时具有较高的效率。二叉排序树的主要特性是:对于任意节点,其左子树中的所有...