二叉树
来源:互联网 发布:nginx rtmp 压力测试 编辑:程序博客网 时间:2024/06/10 17:41
package muke.binarytree;/** * Created by jc6a on 2017/8/31. */public class Node<T extends Comparable> implements Comparable<Node<T>>{ private T data; private Node leftNode; private Node righNode; public Node( T t ){ this(t,null,null); } public Node(T t,Node<T> leftNode,Node<T> rightNode){ this.data = t; this.leftNode = leftNode; this.righNode = rightNode; } @Override public int compareTo(Node<T> o) { return data.compareTo(o.data); } public T getData() { return data; } public void setData(T data) { this.data = data; } public Node getLeftNode() { return leftNode; } public void setLeftNode(Node leftNode) { this.leftNode = leftNode; } public Node getRighNode() { return righNode; } public void setRighNode(Node righNode) { this.righNode = righNode; } @Override public String toString() { return "Node{" + "data=" + data + ", leftNode=" + leftNode + ", righNode=" + righNode + '}'; }}
package muke.binarytree;/** * Created by jc6a on 2017/8/31. */public class Tree { public Node root; public <T> Node search(T key){ if(null == root) return null; Node node = root; while(null!= node){ int compareResult = node.getData().compareTo(key); if(compareResult>0){ node = node.getRighNode(); }else if(compareResult<0){ node = node.getLeftNode(); }else{ break; } } return node; } public <T extends Comparable> void insert(T key){ Node node = new Node(key); if(root == null){ root = node; }else{ Node currentNode = root; boolean isLeftNode = true; while(currentNode != null){ int compareResult = currentNode.compareTo(node); if(compareResult>0){ isLeftNode = true; if(currentNode.getLeftNode()==null) break; currentNode = currentNode.getLeftNode(); }else if(compareResult<0){ isLeftNode = false; if(currentNode.getRighNode()==null) break; currentNode = currentNode.getRighNode(); }else{ return; } } if(isLeftNode){ currentNode.setLeftNode(node); }else{ currentNode.setRighNode(node); } } } public <T extends Comparable> boolean delete(T key){ Node currentNode = root; Node parent = root; Node node = new Node(key); int compareResult; boolean isLeftNode = true; while(null!=currentNode&&(compareResult = currentNode.compareTo(node))!=0){ parent = currentNode; if(compareResult>0){ currentNode = currentNode.getLeftNode(); }else{ isLeftNode = false; currentNode = currentNode.getRighNode(); } } if(null == currentNode) return false; //要删除的节点没有子节点 if(currentNode.getLeftNode() == null && currentNode.getRighNode() == null){ if(currentNode == root){ root = null; }else if(isLeftNode){ parent.setLeftNode(null); }else{ parent.setRighNode(null); } } //要删除的节点只有右节点 else if(currentNode.getLeftNode() == null){ if(currentNode == root){ root = currentNode.getRighNode(); }else if(isLeftNode){ parent.setLeftNode(currentNode.getRighNode()); }else{ parent.setRighNode(currentNode.getRighNode()); } } //要删除的节点只有左节点 else if(currentNode.getRighNode() == null){ if(currentNode == root){ root = currentNode.getLeftNode(); }else if(isLeftNode){ parent.setLeftNode(currentNode.getLeftNode()); }else{ parent.setRighNode(currentNode.getLeftNode()); } } //要删除的节点有两个节点 else{ Node successor = findSuccessor(currentNode); if(currentNode == root){ root = successor; }else if(isLeftNode){ parent.setLeftNode(successor); }else { parent.setRighNode(successor); } successor.setLeftNode(currentNode.getLeftNode()); } return true; } public Node findSuccessor(Node node){ Node parent = node; Node successsor = node; Node current = node.getRighNode(); while(current!=null){ parent = successsor; successsor = current; current = current.getLeftNode(); } if(successsor != node.getRighNode()){ parent.setLeftNode(successsor.getRighNode()); successsor.setRighNode(node.getRighNode()); } return successsor; } public static void main(String[] args) { Tree tree = new Tree(); tree.insert(6); tree.insert(2); tree.insert(4); tree.insert(3); tree.insert(1); tree.insert(5); tree.insert(8); System.out.println(tree.root); tree.delete(2); System.out.println(tree.root); // 6 // / \ // 2 8 // / \ // 1 4 // / \ // 3 5 }}
阅读全文
0 0
- 二叉树、二叉堆
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 4.30 leetcode -30 permutation-sequence
- Centos 安装 Hudson
- Android Studio如何将so文件添加到svn中
- Hue安装及配置
- android 控件添加边框
- 二叉树
- linux-C 学习笔记(四):格式化输入输出&文件流错误
- 常见的设计模式
- shell脚本——比较两个文件大小、权限
- Hibernate之关联关系的CRUD
- 推荐《Java编程思想》
- 利用Django实现RESTful API(一)
- POJ Find them, Catch them (种类并查集)
- Shiro 入门