所谓二叉树,就是一个节点最多只能有两个子节点,而二叉搜索树就是一个经典并简单的二叉树.规则是一个节点的左子节点一定比自己小,右子节点一定大于等于自己(当然也可以反过来).在树基本平衡的时候插入,搜索和删除速度都很快,时间复杂度为O(logN).但是,如果插入的是有序的数据,那效率就会变成O(N),在这个时候,树其实变成了一个链表.
tree代码:
public class Tree {
private Node root;
/**
* 插入节点
* @param data
*/
public void insert(int data){
Node node = new Node(data);
if(this.root == null){
this.setRoot(node);
return;
}
Node current = this.root;
while(true){
if(current.getData() > data){
if(current.hasLeft()){
current = current.getLeft();
}else{
current.setLeft(node);
return;
}
}else if(current.getData() < data){
if(current.hasRight()){
current = current.getRight();
}else{
current.setRight(node);
return;
}
}else{
return;
}
}
}
/**
* 删除节点
* @param key
*/
public void remove(int key){
Node node = this.findNode(key);
if(node == null){
return;
}
Node parent = node.getParent();
//要删除的节点没有子节点
if(!node.hasLeft() && !node.hasRight()){
if(parent == null){
this.setRoot(null);
}else if(node.isLeft()){
parent.setLeft(null);
}else{
parent.setRight(null);
}
//要删除的节点只有一个子节点
}else if(!node.hasRight() || !node.hasLeft()){
Node child = node.hasLeft() ? node.getLeft() : node.getRight();
if(parent == null){
this.setRoot(child);
}else if(node.isLeft()){
parent.setLeft(child);
}else{
parent.setRight(child);
}
//要删除的节点有两个子节点
}else{
Node successor = this.getSuccessor(node);
if (parent == null) {
this.setRoot(successor);
} else if (node.isLeft()) {
parent.setLeft(successor);
} else {
parent.setRight(successor);
}
}
}
/**
* 查找
* @param key
*/
public void find(int key){
Node node = this.findNode(key);
if(node != null){
System.out.println("node data is : " + node.getData());
}
}
/**
* 查找节点
* @param key
* @return
*/
private Node findNode(int key){
Node current = this.root;
while(current.getData() != key){
if(current.getData() > key){
if(current.hasLeft()){
current = current.getLeft();
}else{
return null;
}
}else if(current.getData() < key){
if(current.hasRight()){
current = current.getRight();
}else{
return null;
}
}
}
return current;
}
/**
* 找到继任节点,找出删除节点中右树最小的节点,如果删除节点的右节点
* 没有子节点,则返回null
* @param node
* @return
*/
private Node getSuccessor(Node node){
Node current = node.getRight();
while(current.hasLeft()){
current = current.getLeft();
}
if(node.getRight() != current){
Node parent = current.getParent();
if(current.hasRight()){
parent.setLeft(current.getRight());
}else{
parent.setLeft(null);
}
current.setRight(node.getRight());
}
current.setLeft(node.getLeft());
return current;
}
private void setRoot(Node node){
this.root = node;
if(node != null){
node.setParent(null);
}
}
}
node代码:
public class Node {
private int data;
private Node left;
private Node right;
private Node parent;
public Node(int data){
this.data = data;
}
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
public Node getLeft() {
return left;
}
public void setLeft(Node left) {
this.left = left;
if(this.left != null){
this.left.parent = this;
}
}
public Node getParent() {
return parent;
}
public void setParent(Node parent) {
this.parent = parent;
}
public Node getRight() {
return right;
}
public void setRight(Node right) {
this.right = right;
if(this.right != null){
this.right.parent = this;
}
}
public boolean hasRight(){
return this.right != null;
}
public boolean hasLeft(){
return this.left != null;
}
public boolean isRoot(){
return this.parent == null;
}
public boolean isRight(){
return this.parent.right == this;
}
public boolean isLeft(){
return this.parent.left == this;
}
}
分享到:
相关推荐
二叉排序树(Binary Sort Tree)又称二叉查找(搜索)树(Binary Search Tree)。其定义为:二叉排序树或者是空树,或者是满足如下性质的二叉树:1.若它的左子树非空,则左子树上所有结点的值均小于根结点的值;2.若它的右...
遍历二叉搜索树:** 由于二叉搜索树的有序性,我们可以很容易地进行前序、中序和后序遍历。 - 前序遍历:根 -> 左 -> 右 - 中序遍历:左 -> 根 -> 右 - 后序遍历:左 -> 右 -> 根 遍历算法通常使用递归来实现。 ...
### 数据结构案例:二叉搜索树(Binary Search Tree, BST) #### 一、二叉搜索树(BST)定义 二叉搜索树(Binary Search Tree, BST)是一种非常重要的数据结构,其核心特性在于能够快速地进行查找、插入以及删除操作...
在算法面试中,树、二叉树以及二叉搜索树是非常关键的数据结构,它们在解决各种问题时展现出高效和灵活性。下面将详细讲解这些概念及其重要性质。 **1. 树 (Tree)** 树是一种非线性的数据结构,由一个或多个节点...
二叉搜索树是一种特殊的二叉树,其中每个节点的左子树只包含比该节点值小的元素,而右子树包含的元素都大于该节点值。这样的特性使得BST非常适合进行查找、插入和删除等操作,因为它们的时间复杂度可以达到O(log n)...
二叉搜索树是一种二叉树,其中每个节点包含一个键(key)、一个关联值、一个指向左子树的引用和一个指向右子树的引用。二叉搜索树的性质规定,对于任意节点,其左子树中的所有节点的键都小于该节点的键,而右子树中...
二叉搜索树(Binary Search Tree,BST)是一种特殊的二叉树结构,它的每个节点都具有以下特性:左子树上所有节点的值均小于当前节点的值,右子树上所有节点的值均大于当前节点的值。这种特性使得二叉搜索树在查找、...
二叉排序树(Binary Sort Tree,BST),也称为二叉查找树或二叉搜索树,是一种特殊的二叉树数据结构,它的每个节点都包含一个键(key)、一个关联的值、一个指向左子树的引用和一个指向右子树的引用。在二叉排序树中...
大连理工大学数据结构上机 二叉树三种遍历,先序和中序建立二叉树,后序和中序建立二叉树,二叉搜索树查找,删除,插入
二叉排序树(Binary Sort Tree,BST),也称为二叉搜索树,是一种特殊的二叉树数据结构,它的每个节点都包含一个键(key)、一个关联的值、一个指向左子节点的指针和一个指向右子节点的指针。在二叉排序树中,对于...
1. 平衡二叉搜索树:普通的二叉搜索树在最坏情况下(例如键按顺序插入)退化为链表,导致查找效率降低。为了提高性能,可以使用AVL树或红黑树等自平衡二叉搜索树,它们在每次插入或删除后自动调整,保持树的高度尽...
在IT领域,二叉搜索树(Binary Search Tree, BST)是一种常见的数据结构,它具有左子树上所有节点的值小于根节点的值,右子树上所有节点的值大于根节点的值的特性。这样的特性使得二叉搜索树非常适合进行查找、插入...
二叉搜索树(Binary Search Tree,BST)是二叉树的一种特殊形式,它满足以下性质: 1. 对于任意节点,其左子树中的所有节点的值都小于该节点的值。 2. 对于任意节点,其右子树中的所有节点的值都大于该节点的值。 3...
二叉搜索树(Binary Search Tree,BST)是数据结构中的一种特殊类型,它是一种二叉树,具有以下特性: 1. 每个节点都包含一个键(key)、一个关联的值、一个指向左子节点的引用和一个指向右子节点的引用。 2. 节点...
接着,判断一棵二叉树是否为二叉排序树,可以通过递归检查每个节点是否满足上述二叉排序树的性质。对于每个节点,我们需要确保它的左子树中的所有节点的值都小于它,右子树中的所有节点的值都大于它,并且它的左右...
1. 判断是否为二叉搜索树:通过递归或迭代遍历所有节点,验证每个节点的值是否满足二叉搜索树的条件。 2. 二叉树的深度:通过递归计算从根节点到叶子节点的最大路径长度。 3. 平衡二叉树:如AVL树和红黑树,保证树...
二叉搜索树(Binary Search Tree,BST)是一种特殊类型的二叉树,它的每个节点都包含一个键(key)、一个关联的值、一个指向左子树的指针和一个指向右子树的指针。在二叉搜索树中,对于任何一个节点,其左子树中的...
二叉平衡树:若不是空树,则(1)左右子树都是平衡二叉树;(2)左右子树的深度之差的绝对值不超过1。 本次实验是利用二叉排序树和平衡二叉树达到以下目的:(1)以回车('\n')为输入结束标志,输入数列L,生成一棵二叉...
二叉搜索树(BST)是一种特殊的二叉树,其中每个节点都包含一个键值,且满足以下条件: 1. 左子树中所有节点的键值都小于当前节点的键值。 2. 右子树中所有节点的键值都大于当前节点的键值。 最优二叉搜索树的概念...
"第六章.ppt" 文件可能包含了关于二叉树的深入理论、示例和练习,可能涵盖了二叉树的性质、查找算法、排序算法(如二叉搜索树)以及与二叉链表相关的复杂操作。例如,可能讲解了如何判断一棵二叉树是否平衡,或者...