java二叉排序树的概念和操作
admin
2023-02-13 12:40:02
0

一:概念
二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:
若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
它的左右子树也分别为二叉搜索树。
java二叉排序树的概念和操作

二:操作——查找
先和根节点做对比,相等返回,如果不相等,
关键码key>根节点key,在右子树中找(root=root.rightChild)
关键码key<根节点key,在左子树中找(root=root.leftChild)
否则返回false

三:操作——插入
根据二叉排序树的性质,左孩子比根节点的值小,右孩子比根节点的值大。关键码key先于根节点key作比较,然后再判断与根节点的左或者右作比较,满足二叉排序树性质时,即为合理位置,然后插入。

四: 操作-删除(难点)
设待删除结点为 cur, 待删除结点的双亲结点为 parent
1. cur.left == null

  1. cur 是 root,则 root = cur.right
  2. cur 不是 root,cur 是 parent.left,则 parent.left = cur.right
  3. cur 不是 root,cur 是 parent.right,则 parent.right = cur.right
    2. cur.right == null
  4. cur 是 root,则 root = cur.left
  5. cur 不是 root,cur 是 parent.left,则 parent.left = cur.left
  6. cur 不是 root,cur 是 parent.right,则 parent.right = cur.left
    3. cur.left != null && cur.right != null
  7. 需要使用替换法进行删除,即在它的右子树中寻找中序下的第一个结点(关键码最小),用它的值填补到被删除节点中,再来处理该结点的删除问题

五:实现

public class BinarySearchTree, V>
{ 
public static class Node, V> 
{
K key; 
V value; 
Node left;
Node right;

public String toString()
{ 
return String.format("{%s, %s}", key, value);
}
}
private Node root = null;
public V get(K key) 
{ 
Node parent = null; 
Node cur = root; 
while (cur != null)
{ 
parent = cur;
int r = key.compareTo(cur.key);
if (r == 0)
{ 
return cur.value;
} 
else if (r < 0) {
cur = cur.left; 
}
else 
{
cur = cur.right;
} 
}
return null; 
}
public V put(K key, V value)
{ 
if (root == null)
{ root = new Node<>();
root.key = key;
root.v
display(root);
return null;
}
Node parent = null; 
Node cur = root; 
while (cur != null) 
{ 
parent = cur;
int r = key.compareTo(cur.key);
if (r == 0) 
{ 
V oldValue = cur.value; 
cur.value = value; 
display(root); 
return oldValue; 
}
else if (r < 0)
{ 
cur = cur.left; 
} 
else
{ 
cur = cur.right;
} 
}
Node node = new Node<>(); 
node.key = key; 
node.value = value;
int r = key.compareTo(parent.key);
if (r < 0)
{ parent.left = node;
} 
else { parent.right = node; 
}
display(root); 
return null; 
}
public V remove(K key) 
{ 
Node parent = null; 
Node cur = root; 
while (cur != null) 
{ 
int r = key.compareTo(cur.key);
if (r == 0)
{ 
V oldValue = cur.value; 
deleteNode(parent, cur);
display(root); 
return oldValue; } 
else if (r < 0)
{ parent = cur; cur = cur.left; }
else { parent = cur; cur = cur.right; 
} 
}
display(root); 
return null;
}
private void deleteNode(Node parent, Node cur) 
{
if (cur.left == null)
{
if (cur == root)
{
root = cur.right;
} 
else if (cur == parent.left)
{ parent.left = cur.right; }
else { parent.right = cur.right; }
} else if (cur.right == null)
{ 
if (cur == root)
{ root = cur.left; }
else if (cur == parent.left)
{ parent.left = cur.left; }
else { parent.right = cur.left; }
} else {
// 去 cur 的右子树中寻找最小的 key 所在的结点 scapegoat
// 即 scapegoat.left == null 的结点
Node goatParent = cur;
Node scapegoat = cur.right;
while (scapegoat.left != null)
{ goatParent = scapegoat; scapegoat = cur.left; }
cur.key = scapegoat.key;
cur.value = scapegoat.value;
if (scapegoat == goatParent.left)
{
goatParent.left = scapegoat.right;
}
else { goatParent.right = scapegoat.right; }
} 
}
private static ,V> void display(Node node) 
{
System.out.print("前序: ");
preOrder(node);
System.out.println();
System.out.print("中序: ")
inOrder(node); 
System.out.println(); }
private static ,V> void preOrder(Node node)
{ if (node == null)
{ return; }
System.out.print(node + " ");
preOrder(node.left);
preOrder(node.right); }
private static ,V> void inOrder(Node node)
{ if (node == null) 
{ return; }
inOrder(node.left);
System.out.print(node + " ");
inOrder(node.right); }
public static void main(String[] args)
{ 
BinarySearchTree tree = new BinarySearchTree<>(); 
int[] keys = { 5, 3, 7, 4, 2, 6, 1, 9, 8 }; 
for (int key : keys) 
{
tree.put(key, String.valueOf(key)); }
System.out.println("=================================="); tree.put(3, "修改过的 3"); System.out.println("=================================="); tree.remove(9);
tree.remove(1); t
ree.remove(3);
``` } 
}
**六:性能分析**
插入和删除操作都必须先查找,查找效率代表了二叉搜索树中各个操作的性能。
对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数越多。
但对于同一个关键码集合,如果各关键码插入的次序不同,可能得到不同结构的二叉搜索树。
**七: 和 java 类集的关系**
TreeMap 和 TreeSet 即 java 中利用搜索树实现的 Map 和 Set;

相关内容

热门资讯

德国总理:美国正在被伊朗羞辱 德国之声4月27日报道,德国总理默茨在访问一所学校时表示,在当前的持续冲突中,伊朗领导层正试图羞辱美...
理响中国|“长”歌以行,风云激... 光阴如梭,东方潮阔。这里是中国的长三角,世界的长三角。无论过去、现在还是未来,这片土地都因时代而生,...
白宫:特朗普及其国安团队开会讨... 新华社华盛顿4月27日电 美国白宫新闻秘书莱维特27日在记者会上证实,总统特朗普及其国家安全团队当天...
人民日报刊文:日本放开杀伤性武... 日本放开杀伤性武器出口推高地缘冲突风险(国际论坛)常思纯《人民日报》(2026年04月28日 第 0...
医疗保障法草案二审:明确生育保... 满足多样化健康保障需求本报记者 彭 波4月27日,医疗保障法草案二审稿提请十四届全国人大常委会第二十...
天津一景区发生自转旋翼机事故1... 澎湃新闻记者 吕新文中国民用航空华北地区管理局4月22日公布《豪客通航“10•1”天津长芦汉盐旅游区...
卡塔尔埃米尔与美国总统特朗普通... 当地时间24日,卡塔尔埃米尔塔米姆与美国总统特朗普通电话,重点就中东地区局势以及伊朗与美国谈判问题交...
男子30年前被扣押2859克黄... 澎湃新闻记者 王鑫家住辽宁省大连市的潘永嘉近日向澎湃新闻反映称,三十年前,他在大连周水子机场被盖州市...
商务部:取消反制欧盟两家金融机... 中华人民共和国商务部令二〇二六年 第1号鉴于欧盟已取消对中国两家金融机构的制裁措施,现公布《关于取消...
过去24小时共有5艘船只通过霍... 总台记者当地时间24日获悉,过去24小时内,共有5艘船只通过霍尔木兹海峡,其中包括一艘伊朗油轮。(总...