二叉搜索树的Java实现
来源:互联网 发布:新版php卡盟排行榜源码 编辑:程序博客网 时间:2024/05/24 06:50
刚刚自己实现了一下二叉搜索树,记录一下感想
1、首先二叉搜索树是需要有父节点的。这个在删除节点的时候会用到。
2、然后创建树可以借鉴Java中的集合类,树->抽象 二叉树->二叉搜索树的结构。显得专业一点。
见代码:
/** * 所有值是可以比较的树的接口 * @param <T> */public interface Tree<T extends Comparable<T>> { void addValue(T val) throws BinarySearchTree.HasTheValueAlreadyException; // 增加值 void removeValue(T val) throws BinarySearchTree.WithoutValueException; //删除值 boolean findValue(T val); //查找值 boolean isEmpty(); //查看树是否为空 void print(); //打印}
public abstract class AbstractTree implements Tree{ protected Node root; @Override public boolean isEmpty() { return root == null; }}
public class BinarySearchTree extends AbstractTree { @Override public void addValue(Comparable val) throws HasTheValueAlreadyException { Node node = new Node(val); addNode(root, node); } private void addNode(Node parent, Node new_node) throws HasTheValueAlreadyException { if(parent == null) { root = new_node; return; } Node left = parent.left; Node right = parent.right; int compare_res = parent.value.compareTo(new_node.value); if(compare_res == 0) { throw new HasTheValueAlreadyException("the value " + new_node.value + " " + "has existed"); } if(compare_res == -1) { if(right == null) { parent.right = new_node; new_node.parent = parent; } else { addNode(parent.right, new_node); } return; } if(compare_res == 1) { if(left == null) { parent.left = new_node; new_node.parent = parent; } else { addNode(parent.left, new_node); } return; } } @Override public void removeValue(Comparable val) throws WithoutValueException { Node node = findNode(root, val); if(node == null) { throw new WithoutValueException("without the value" + " " + val); } Node realNode = node; while (realNode.left != null) { realNode = realNode.left; } node.value = realNode.value; if(realNode == node) { Node parent = realNode.parent; Node realNodeRight = realNode.right; if(parent == null) { root = realNodeRight; return; } else { if(parent.left == realNode) { parent.left = realNodeRight; } else if(parent.right == realNode) { parent.right = realNodeRight; } if(realNodeRight != null) realNodeRight.parent = parent; return; } } else { Node parent = realNode.parent; Node realNodeRight = realNode.right; parent.left = realNodeRight; if(realNodeRight != null) realNode.parent = parent; return; } } @Override public boolean findValue(Comparable val) { Node res = findNode(root, val); return res == null; } @Override public void print() { printTree(root); System.out.println(); } private void printTree(Node node){ if(node == null) return; System.out.print(node.value + " "); printTree(node.left); printTree(node.right); } private Node findNode(Node parent, Comparable val) { if(parent == null) return null; int compare_res = parent.value.compareTo(val); if(compare_res == 0) return parent; if(compare_res == -1) { return findNode(parent.right, val); } if(compare_res == 1) { return findNode(parent.left, val); } return null; } class HasTheValueAlreadyException extends Exception { public HasTheValueAlreadyException(String s){ super(s); } } class WithoutValueException extends Exception { public WithoutValueException(String s) { super(s); } }}
public class Node<T extends Comparable<T>> { protected T value; protected Node parent; protected Node left; protected Node right; public Node(T val) { this.value = val; } public T getValue() { return value; } public void setValue(T value) { this.value = value; } public Node getParent() { return parent; } public void setParent(Node parent) { this.parent = parent; } public Node getLeft() { return left; } public void setLeft(Node left) { this.left = left; } public Node getRight() { return right; } public void setRight(Node right) { this.right = right; }}
public class Test { public static void main(String[] args) { BinarySearchTree binarySearchTree = new BinarySearchTree(); try { binarySearchTree.addValue(45); binarySearchTree.addValue(24); binarySearchTree.addValue(53); binarySearchTree.addValue(12); binarySearchTree.addValue(37); binarySearchTree.addValue(93); binarySearchTree.removeValue(45); binarySearchTree.print(); } catch (BinarySearchTree.HasTheValueAlreadyException e) { e.printStackTrace(); } catch (BinarySearchTree.WithoutValueException e) { e.printStackTrace(); } }}
阅读全文
0 0
- 简单二叉搜索树的JAVA实现。
- 【java】二叉搜索树的实现
- 二叉搜索树的基本java实现
- 二叉搜索树的java实现
- 最优二叉搜索树的java实现
- 二叉搜索树的 java 代码实现
- 二叉搜索树的Java实现
- 二叉树、二叉搜索树、AVL树的java实现
- java实现二叉搜索树
- Java实现二叉搜索树
- Java实现二叉搜索树
- Java实现二叉搜索树
- 二叉搜索树JAVA实现
- Java实现二叉搜索树
- 二叉搜索树Java实现
- 二叉搜索树 java实现
- Java实现二叉搜索树
- 二叉搜索树的实现
- 全排列及相关扩展算法(六)——全排列最蛋疼的算法:邻位对换法
- mybatis详解——properties以及别名定义
- Windows消息:怎样使用RegisterWindowMessage注册消息
- SSM框架的流程学习笔记以及每一步容易出错的地方
- 委托和事件学习
- 二叉搜索树的Java实现
- centos安装nginx
- 二分查找总结
- android MPchart 折现图只有一个点不显示问题
- 博弈——sg函数实现和讲解
- centos X64下安装php5.5.6
- iOS之《Effective Objective-C 2.0》读书笔记(9)
- Spring boot之代码规范书写
- 使用idea搭建自己的SpringBoot initializer构建服务器