详解java二叉排序树_二叉排序树的java实现

树的结点定义

public class TreeNode {

private int data;

public TreeNode leftNode;

public TreeNode rightNode;

public TreeNode(int key){

data = key;

}

public int getData(){

return data;

}

public void setData(int value){

data = value;

}

public void operation(){

System.out.println(data);

}

}

树的实现

public class BinaryTree {

public int count;

private TreeNode root;

public BinaryTree(){

root = new TreeNode(0);

}

public TreeNode getTreeRoot(){

return root;

}

// 查找结点

public static TreeNode find(BinaryTree tree, int key){

return BinaryTree.find(tree.getTreeRoot(), key);

}

public static TreeNode find(TreeNode currentNode, int key){

if ((null == currentNode) || (currentNode.getData() == key)){

return currentNode;

}

if (currentNode.getData() > key){

return BinaryTree.find(currentNode.leftNode, key);

}else{

return BinaryTree.find(currentNode.rightNode, key);

}

}

// 前序遍历

public static void preOrderTraversal(TreeNode currentNode){

if (null != currentNode){

preOrderTraversal(currentNode.leftNode);

currentNode.operation();

preOrderTraversal(currentNode.rightNode);

}

}

// 后序遍历

public static void postOrderTraversal(TreeNode currentNode){

if (null != currentNode){

postOrderTraversal(currentNode.rightNode);

currentNode.operation();

postOrderTraversal(currentNode.leftNode);

}

}

// 插入结点

public static void insert(BinaryTree tree, int data){

BinaryTree.insert(tree.getTreeRoot(), null, false, data);

}

public static boolean insert(TreeNode currentNode, TreeNode parentNode, boolean isLeftChild, int data) {

if (null != currentNode){

if (currentNode.getData() > data){

BinaryTree.insert(currentNode.leftNode, currentNode, true, data);

}else {

BinaryTree.insert(currentNode.rightNode, currentNode, false, data);

}

}else {

TreeNode insertNode = new TreeNode(data);

if (isLeftChild){

parentNode.leftNode = insertNode;

}else {

parentNode.rightNode = insertNode;

}

}

return true;

}

// 删除结点

public static void delete(BinaryTree tree, int data){

BinaryTree.delete(tree.getTreeRoot(), null, false, data);

}

public static boolean delete(TreeNode currentNode, TreeNode parentNode, boolean isLeftChild, int data){

if (null != currentNode){

if (currentNode.getData() > data){

BinaryTree.delete(currentNode.leftNode, currentNode, true, data);

}else if(currentNode.getData() < data){

BinaryTree.delete(currentNode.rightNode, currentNode, false, data);

}else{

TreeNode successor = processSuccessor(currentNode);

if (isLeftChild){

parentNode.leftNode = successor;

}else {

parentNode.rightNode = successor;

}

}

}

return true;

}

/* 1.待删除结点为叶子结点

2.待删除结点有一个叶子结点

3.待删除结点有两个叶子节点 */

public static TreeNode processSuccessor(TreeNode delNode){

if ((null == delNode.leftNode) && (null == delNode.rightNode)){

return null;

}else if ((null == delNode.leftNode) && (null != delNode.rightNode)){

return delNode.rightNode;

}else if ((null != delNode.leftNode) && (null == delNode.rightNode)){

return delNode.leftNode;

}else{

// 从delnode 的右子树找最小key值结点作为继承者.

return getSuccessor(delNode, delNode.rightNode, delNode);

}

}

// 此时 delNode 、successor 和 successorParent 都不为 null.

public static TreeNode getSuccessor(TreeNode delNode, TreeNode successor, TreeNode successorParent){

if (null != successor.leftNode){

getSuccessor(delNode, successor.leftNode, successor);

}

if (successor != delNode.rightNode){

successorParent.leftNode = successor.rightNode;

successor.rightNode = delNode.rightNode;

}

return successor;

}

}

测试类

public class Test {

public static void main(String[] args) {

BinaryTree tree = new BinaryTree();

int[] array = {10 ,60, 666, 888, 80, 30, 50, 99, 999, 1024, 20};

for (int loop = 0; loop < array.length; loop++) {

tree.insert(tree, array[loop]);

tree.count++;

}

TreeNode node = tree.find(tree, 80);

if (null != node){

System.out.println(node.getData());

System.out.println(tree.count);

}

System.out.println("preOrderTraversal.");

BinaryTree.preOrderTraversal(tree.getTreeRoot());

BinaryTree.delete(tree, 20);

System.out.println("postOrderTraversal.");

BinaryTree.postOrderTraversal(tree.getTreeRoot());

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值