文章标题
来源:互联网 发布:淘宝怎么快速上穿 编辑:程序博客网 时间:2024/05/20 23:31
package datastructures.binarytree;/** * 演示二叉树的操作 */public class BinaryTree { /** * 根节点 */ private Node root; /** * 查找一个节点 * @param key 要查找的id值 * @return */ public Node find(int key){ //当前节点 Node current = root; while(current.getId()!=key){ if(current.getId() > key){ current = current.getLeftChild(); }else if(current.getId() < key){ current = current.getRightChild(); } if(current == null){ return null; } } return current; } /** * 插入一个节点 * @param id * @param data */ public void insert(int id,int data){ //1:先创建一个新节点 Node newNode = new Node(id,data); if(root == null){ root = newNode; }else{ //2:查找要插入的位置 Node current = root; Node parent = null; while(true){ parent = current; if(id < current.getId()){ current = current.getLeftChild(); //如果没有左子节点 if(current == null){ //3:修改相应的节点的属性 parent.setLeftChild(newNode); return; } }else{ current = current.getRightChild(); if(current==null){ //3:修改相应的节点的属性 parent.setRightChild(newNode); return; } } } } } /** * 前序获取节点数据 * @param node */ public void preOrder(Node node){ if(node != null){ System.out.println(node.getId()+" - "); preOrder(node.getLeftChild()); preOrder(node.getRightChild()); } } /** * 中序获取节点数据 * @param node */ public void inOrder(Node node){ if(node != null){ inOrder(node.getLeftChild()); System.out.println(node.getId()+" - "); inOrder(node.getRightChild()); } } /** * 后序获取节点数据 * @param node */ public void postOrder(Node node){ if(node != null){ postOrder(node.getLeftChild()); postOrder(node.getRightChild()); System.out.println(node.getId()+" - "); } } /** * 获取最小节点 * @return */ public Node getMinNode(){ Node current = root; Node lastNode = null; while(current!=null){ lastNode = current; current = current.getLeftChild(); } return lastNode; } /** * 获取最大节点 * @return */ public Node getMaxNode(){ Node current = root; Node lastNode = null; while(current!=null){ lastNode = current; current = current.getRightChild(); } return lastNode; } /** * 删除一个节点 * @param key * @return */ public boolean delete(int key){ //1:找到要删除的节点 Node current = root; Node parent = root; boolean isLeftChild = true; while(current.getId()!=key){ parent = current; if(current.getId() > key){ isLeftChild = true; current = current.getLeftChild(); }else if(current.getId() < key){ isLeftChild = false; current = current.getRightChild(); } if(current == null){ return false; } } //2:没有子节点 if(current.getLeftChild()==null && current.getRightChild()==null){ this.noChildren(parent, current, isLeftChild); } //3:只有一个子节点 //只有左节点 else if(current.getRightChild()== null){ this.oneLeftChild(parent, current, isLeftChild); } //只有右节点 else if(current.getLeftChild() == null){ this.oneRightChild(parent, current, isLeftChild); } //4:有两个子节点 else{ //4.1:找到中序后继节点 Node successor = this.getSuccessor(current); if(current == root){ root = successor; }else{ if(isLeftChild){ parent.setLeftChild(successor); }else{ parent.setRightChild(successor); } } //重新设置successor的leftChild successor.setLeftChild(current.getLeftChild()); } return true; } /** * 找到要删除节点的中序后继节点 * @param delNode * @return */ private Node getSuccessor(Node delNode){ Node successor = delNode; Node successorParent = delNode; Node current = delNode.getRightChild(); //查找节点 while(current!=null){ successorParent = successor; successor = current; current = current.getLeftChild(); } //设置相应的值 if(successor!=delNode.getRightChild()){ successorParent.setLeftChild(successor.getRightChild()); successor.setRightChild(delNode.getRightChild()); } return successor; } private void oneRightChild(Node parent,Node current,boolean isLeftChild){ if(current == root){ root = current.getRightChild(); }else{ if(isLeftChild){ parent.setLeftChild(current.getRightChild()); }else{ parent.setRightChild(current.getRightChild()); } } } private void oneLeftChild(Node parent,Node current,boolean isLeftChild){ if(current == root){ root = current.getLeftChild(); }else{ if(isLeftChild){ parent.setLeftChild(current.getLeftChild()); }else{ parent.setRightChild(current.getLeftChild()); } } } private void noChildren(Node parent,Node current,boolean isLeftChild){ if(current == root){ root = null; }else{ if(isLeftChild){ parent.setLeftChild(null); }else{ parent.setRightChild(null); } } } public static void main(String[] args) { BinaryTree t = new BinaryTree(); t.insert(6,6); t.insert(5,2); t.insert(8,2433); t.insert(3, 5); t.insert(7,77); t.insert(9,233);// System.out.println(t.root.toString());// // t.inOrder(t.find(6));// // Node min = t.getMinNode();// Node max = t.getMaxNode();// System.out.println("min=="+min);// System.out.println("max=="+max); t.delete(8); System.out.println(t.root.toString()); }}
0 0
- 文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题 文章标题 文章标题 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- maven无法加载本地jar包以及maven项目打包后本地jar包没有打进项目的问题解决办法
- Boost.Asio和ACE之间关于Socket编程的比较
- linux下挂载(mount)光盘镜像文件、移动硬盘、U盘、Windows和NFS网络共享
- Google I/O 2016 笔记之Espresso 进阶
- AFNetworking网络请求时注意的cookies缓存问题
- 文章标题
- PHP集群session共享
- jieba分词源码阅读
- 完美解决ListView和CheckBox焦点冲突及复用时CheckBox错位等一系列问题
- load-on-startup在web.xml中的含义
- 如何把自己的CSDN博客内容和百度搜索关联起来
- LIB和DLL的区别与使用
- 机器学习的相关学习链接
- mysql in和limit不能同时使用