二叉查找树(一)

查找树是一种数据结构,支持多种动态集合操作,包括构造,查找,插入,删除,寻找最小值和最大值等。

二叉查找树按照二叉树结构组织,通常采用链表表示。
    1.每一个节点表示一个对象,节点包括data数据部分,指针(left,right指针)。
    2.若某节点的儿子节点不存在,则相应的儿子结点为空。
    
特点:
    1.根节点的左子树不为空,则左子树所有节点的值均小于根节点的值
    2.根节点的右子树不为空,则右子树所有节点的值均大于根节点的值
    3.根节点的左右子树本身也是二叉查找树
    4.中序遍历二叉查找树,所得到的中序遍历序列是一个递增、有序的序列
    
1.查找:从根节点开始查找
    a.查找失败:二叉树为空
    b.查找成功:
        1)若,查找值就是根节点值,那么成功
        2)若,查找值小于根节点值,在左子树递归查找
        3)若,查找值大于根节点值,在右子树递归查找
2.删除
    a.若,删除的节点没有子节点,直接将其父节点的相应位置的引用设置为空
    b.若,删除的节点只有一个子节点,只要将这个要删除的节点的子节点代替它的位置即可
    c.若,删除的节点有两个子子节点,用最接近于删除节点的中序后继节点来替代它。
3.插入:将待插入的节点与根节点比较
    a.待插入的节点小于根节点,,递归到相应根节点的左子树,直到找到左子树为空的位置
    b.待插入的节点大于根节点,,递归到相应根节点的右子树,直到找到右子树为空的位置
范例:
1.节点类-Node

 1 /**
 2  * 节点类
 3  * @author Ivy
 4  */
 5 public class Node {
 6     // 节点值
 7     int data;
 8     // 左子树
 9     Node left;
10     // 右子树
11     Node right;
12
13     public Node(int data, Node left, Node right) {
14         this.data = data;
15         this.left = left;
16         this.right = right;
17     }
18
19 }

2.插入算法-InsertBinaryTree

 1 /**
 2  * 节点类
 3  * @author Ivy
 4  */
 5 public class Node {
 6     // 节点值
 7     int data;
 8     // 左子树
 9     Node left;
10     // 右子树
11     Node right;
12
13     public Node(int data, Node left, Node right) {
14         this.data = data;
15         this.left = left;
16         this.right = right;
17     }
18
19 }

3.查找算法-FindBinaryTree

  1 /**
  2  * @Description: 二叉查找树查找算法
  3  * @author Ivy
  4  */
  5 public class FindBinaryTree {
  6 //    根节点
  7     private Node root;
  8 //    插入节点
  9     public void add(int data) {
 10         System.out.println("插入节点:" + data);
 11         if (null == root) {
 12             root = new Node(data, null, null);
 13         } else {
 14             addTree(root,data);
 15         }
 16     }
 17
 18     private void addTree(Node root, int data) {
 19         if (root.data > data) {
 20 //            进入左子树
 21             if (null == root.left) {
 22                 root.left = new Node(data, null, null);
 23             } else {
 24                 addTree(root.left, data);//吊本身的方法,实现递归进入左子树
 25             }
 26         } else {
 27 //            进入右子树
 28             if (null == root.right) {
 29                 root.right = new Node(data, null, null);
 30             } else {
 31                 addTree(root.right, data);//吊本身的方法,实现递归进入右子树
 32             }
 33         }
 34
 35     }
 36
 37 //    中序遍历二叉查找树
 38     public void show() {
 39         showTree(root);
 40     }
 41
 42     private void showTree(Node root) {
 43         if (null != root.left) {
 44             showTree(root.left);
 45         }
 46         System.out.println(root.data + " ");
 47         if (null != root.right) {
 48             showTree(root.right);
 49         }
 50
 51     }
 52 //    查找算法
 53     public Node searchNode(int findData) {
 54         Node node = null;
 55         Node rootNode = root;
 56         while (true) {
 57             if (null == rootNode) {
 58                 break;
 59             }
 60             if (rootNode.data == findData) {
 61                 node = rootNode;
 62                 break;
 63             }
 64             if (rootNode.data > findData) {
 65                 rootNode = rootNode.left;
 66             } else {
 67                 rootNode = rootNode.right;
 68             }
 69
 70         }
 71         return node;
 72     }
 73
 74 //    测试
 75     public static void main(String[] args) {
 76         FindBinaryTree tree = new FindBinaryTree();
 77         tree.add(9);
 78         tree.add(13);
 79         tree.add(45);
 80         tree.add(2);
 81         tree.add(34);
 82         tree.add(45);
 83         tree.add(5);
 84         tree.add(3);
 85         tree.add(78);
 86         tree.add(56);
 87         tree.show();
 88
 89         int findData = 0;
 90         Scanner input = new Scanner(System.in);
 91         System.out.println("请输入要查找的节点值:");
 92         findData = input.nextInt();
 93         Node node = tree.searchNode(findData);
 94         if (null == node) {
 95             System.out.println("查找失败!");
 96         } else {
 97             System.out.println("查找成功,查找的节点值为:" + node.data);
 98         }
 99     }
100
101 }
时间: 2024-10-28 02:06:50

二叉查找树(一)的相关文章

C语言实现二叉查找树

#include<stdio.h> #include<stdlib.h> /* * 数据结构:二叉查找树,即左孩子<父节点<右孩子 * C语言实现 * 2015-9-13 */ typedef struct TreeNode *PtrToNode; typedef PtrToNode Tree; typedef PtrToNode Position; struct TreeNode { int Element; Tree Left; //节点左孩子 Tree Right

按层遍历二叉查找树

<算法>中二叉查找树一节的习题:按层遍历二叉查找树. 可以使用队列来管理二叉查找树中的节点,节点按照如下方法入队出队: 节点x入队 当队列不为空时使用队列的第一个元素first 如果节点first.left不为空则将fisrt.left入队 如果节点first.right不为空则将first.right入队 将first节点出队 /** * Created by elvalad on 2014/12/5. * 按层遍历二叉查找树 */ import java.util.Iterator; im

二叉查找树BST 模板

二叉查找树BST 就是二叉搜索树 二叉排序树. 就是满足 左儿子<父节点<右儿子 的一颗树,插入和查询复杂度最好情况都是logN的,写起来很简单. 根据BST的性质可以很好的解决这些东西 1.查询值 int Search(int k,int x) { if(x<a[k].key && a[k].l) Search(a[k].l,x); else if(x>a[k].key && a[k].r) Search(a[k].r,x); else retur

二叉查找树

二叉查找(搜索)树(Binary Search Tree)又称二叉排序树(Binary Sort Tree),是基于二叉树,BST具有下列性质:1.若左子树不空,则其左子树上的所有结点的值均小于根结点的值:2.若右子树不空,则其右子树上的所有结点的值均大于根结点的值:3.左.右子树也分别为二叉查找树. 结点类 public class BinaryNode {      Integer data;      BinaryNode leftChild;      BinaryNode rightC

平衡树初阶——AVL平衡二叉查找树+三大平衡树(Treap + Splay + SBT)模板【超详解】

平衡树初阶——AVL平衡二叉查找树 一.什么是二叉树 1. 什么是树. 计算机科学里面的树本质是一个树状图.树首先是一个有向无环图,由根节点指向子结点.但是不严格的说,我们也研究无向树.所谓无向树就是将有向树的所有边看成无向边形成的树状图.树是一种递归的数据结构,所以我们研究树也是按照递归的方式去研究的. 2.什么是二叉树. 我们给出二叉树的递归定义如下: (1)空树是一个二叉树. (2)单个节点是一个二叉树. (3)如果一棵树中,以它的左右子节点为根形成的子树都是二叉树,那么这棵树本身也是二叉

java 二叉查找树

//接口+抽象类+实现类package wangChaoPA实习工作练习.com.进阶篇.二叉查找树; import java.util.Iterator;public interface Tree<E extends Comparable<E>>{    // 从树中删除e    boolean delete(E e); // 树的大小    int getSize(); // 中序遍历树    void inorder(); // 把e插入到tree中    boolean i

二叉查找树C++实现

二分查找树特点: (1) 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值: (2) 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值: (3) 任意节点的左.右子树也分别为二叉查找树. (4) 没有键值相等的节点(no duplicate nodes). 前序遍历:中左右 中序遍历:左中右 序遍历:左右中 二叉查找树的重点在于如何找节点的前驱节点和后继节点 #pragma once #include <iostream> using namespace st

[二叉查找树] 二叉排序树

题目描述 输入一系列整数,建立二叉排序数,并进行前序,中序,后序遍历. 输入 输入第一行包括一个整数n(1<=n<=100).接下来的一行包括n个整数. 输出 可能有多组测试数据,对于每组数据,将题目所给数据建立一个二叉排序树,并对二叉排序树进行前序.中序和后序遍历.每种遍历结果输出一行.每行最后一个数据之后有一个空格. 样例输入 1 2 2 8 15 4 21 10 5 39 样例输出 2 2 2 8 15 8 15 15 8 21 10 5 39 5 10 21 39 5 10 39 21

图解数据结构(7)——二叉查找树及平衡二叉查找树(一共14篇)

这篇将是最有难度和挑战性的一篇,做好心理准备!十.二叉查找树(BST)前一篇介绍了树,却未介绍树有什么用.但就算我不说,你也能想得到,看我们Windows的目录结构,其实就是树形的,一个典型的分类应用.当然除了分类,树还有别的作用,我们可以利用树建立一个非常便于查找取值又非常便于插入删除的数据结构,这就是马上要提到的二叉查找树(Binary Search Tree),这种二叉树有个特点:对任意节点而言,左子(当然了,存在的话)的值总是小于本身,而右子(存在的话)的值总是大于本身. 这种特性使得我

二叉查找树 _ 二叉排序树 _ 二叉搜索树_C++

一.数据结构背景+代码变量介绍 二叉查找树,又名二叉排序树,亦名二叉搜索树 它满足以下定义: 1.任意节点的子树又是一颗二叉查找树,且左子树的每个节点均小于该节点,右子树的每个节点均大于该节点. 2.由1可推出,任意节点的左孩子小于该节点,右孩子大于该节点 以上讨论的是左(右)孩子(子树)存在的情况 它的中序遍历是一个升序的排序 在参考代码中,我们定义有: 主程序中,k代表插入或删除或查找的节点的值 root,根节点位置:a[i],第 i 号节点的值:cl[i],第 i 号节点左孩子的位置:cr