Java实现二叉树的基本操作
来源:互联网 发布:有关网络的英语单词 编辑:程序博客网 时间:2024/05/01 13:19
通过Java语言来描述二叉树插入结点,查询结点,删除结点,和三种方式遍历结点。
Node类实现代码:
/** * 树的结点 * @author wanglong * 2016-9-24 下午9:23:33 */public class Node { /** * 结点携带的数据: * idData:代表编号 * nameData:代表姓名数据 */ public int idData; public String nameData; //左右子树 public Node leftNode; public Node rightNode; public Node(int idData , String nameData) { this.idData = idData; this.nameData = nameData; }}
二叉树类实现代码
/** * 实现二叉树的结点的插入,遍历和删除 * * @author wanglong 2016-9-24 下午9:28:34 */public class Tree { // 根结点 public Node root; /** * 实现二叉树插入结点功能。 * * @param value 插入的id值 * @param nameData 插入的姓名数据 */ public void insertNode(int value, String nameData) { // 封装结点 Node newNode = new Node(value, nameData); // 声明父结点 Node parent; // 当前结点 Node current = root; if (root == null) { root = newNode; } else { while (true) { parent = current; if (current.idData > value) { current = current.leftNode; if (current == null) { parent.leftNode = newNode; return; } } else { current = current.rightNode; if (current == null) { parent.rightNode = newNode; return; } } } } } /** * 查找结点 * @param value * @return */ public Node find(int value){ //将当前的结点作为跟结点 Node current = root; while(current.idData != value){ if(current.idData>value){ current = current.leftNode; }else{ current = current.rightNode; } if(current == null){ return null; } } return current; } /** * 删除结点 * 分三种情况 * 1.该结点是叶子结点, * 没有子节点。要删除该结点,只需要改变该节点的父节点的引用值,将指向该节点的引用设置为null * 2.该节点有一个子节点 * 改变父节点的引用,将其直接指向要删除的节点的子节点 * 3.该节点有两个子节点 * 要删除有两个子节点的结点,就需要使用它的中序后继来代替该结点(中序后继:就是先右边,然后一直左边,) * @param value * @return */ public boolean delete(int value){ //将根结点作为当前结点 Node current = root; //将根节点作为父结点 Node parent = root; //判断是不是左结点 boolean isLeftNode = false; while(current.idData != value){ //当前结点的父节点 parent = current; if(current.idData > value){ current = current.leftNode; isLeftNode = true; }else{ current = current.rightNode; isLeftNode = false; } if(current == null){ return false; } } //分为三种情况删除结点 if(current.leftNode == null && current.rightNode == null){ if(current == root){ root = null; }else if(isLeftNode){ parent.leftNode = null; }else{ parent.rightNode = null; } }else if(current.leftNode == null){ if(current == root){ root = root.rightNode; }else if(isLeftNode){ parent.leftNode = current.rightNode; }else { parent.rightNode = current.rightNode; } }else if(current.rightNode == null){ if(current == root){ root = root.leftNode; }else if(isLeftNode){ parent.leftNode = current.leftNode; }else{ parent.rightNode= current.leftNode; } }else{ Node successor = getSuccessor(current); if(current == root){ root = successor; }else if(isLeftNode){ parent.leftNode = successor; }else { parent.rightNode = successor; } successor.leftNode = current.leftNode; } return true; } /** * 找出替换delNode这个结点的结点(运用中序后继) * @param delNode * @return */ public Node getSuccessor(Node delNode){ //替换的结点 Node successor = delNode; //替换结点的父结点 Node successorParent =delNode; //当前结点 Node current = delNode.rightNode; while(current != null){ successorParent = successor; successor = current; current = current.leftNode; } if(successor != delNode.rightNode){ successorParent.leftNode = null; successor.rightNode = delNode.rightNode; } return successor; } /** * 前序遍历 * 原理: * 1.访问根结点 * 2.前序遍历左子树 * 3.前序比遍历右子树 * @param localNode 二叉树的根结点 */ public void frontOrder(Node localNode){ if(localNode!=null){ //1.访问根结点 System.out.println(localNode.idData+" "+localNode.nameData); //2.前序遍历左子树 frontOrder(localNode.leftNode); //3.3.前序比遍历右子树 frontOrder(localNode.rightNode); } } /** * 中序遍历 * 原理: * 1.中序遍历左子树 * 2.访问根结点 * 3.中序比遍历右子树 * @param localNode */ public void inOrder(Node localNode){ if(localNode!=null){ // 1.中序遍历左子树 inOrder(localNode.leftNode); //2.访问根结点 System.out.println(localNode.idData+" "+localNode.nameData); // 3.中序比遍历右子树 inOrder(localNode.rightNode); } } /** * 后序遍历 * 原理: * 1.后序遍历左子树 * 2.后序遍历右子树 * 3.访问根结点 * @param localNode */ public void afterOrder(Node localNode){ if(localNode != null){ //1.后序遍历左子树 afterOrder(localNode.leftNode); //2.后序遍历右子树 afterOrder(localNode.rightNode); // 3.访问根结点 System.out.println(localNode.idData+" "+localNode.nameData); } } }
测试代码:
public static void main(String[] args) { Tree tree =new Tree(); tree.insertNode(10, "wang1"); tree.insertNode(4, "wang2"); tree.insertNode(3, "wang3"); tree.insertNode(15, "wang4"); tree.insertNode(20, "wang1"); tree.insertNode(30, "wang2"); tree.insertNode(1, "wang3"); tree.insertNode(19, "wang4"); tree.insertNode(6, "wang4");// System.out.println(tree.root.idData);// System.out.println(tree.root.leftNode.idData);// System.out.println(tree.root.rightNode.idData);// System.out.println(tree.root.leftNode.leftNode.idData);// tree.afterOrder(tree.root);// tree.delete(4); tree.afterOrder(tree.root); }
运行结果
1 wang33 wang36 wang44 wang219 wang430 wang220 wang115 wang410 wang1
0 0
- Java实现二叉树的基本操作
- Java实现二叉树的基本操作
- JAVA实现二叉树的基本操作
- 数据结构:二叉树的基本操作(JAVA实现)
- 二叉树基本操作--java实现
- 二叉树基本操作—Java实现
- java实现二叉树基本操作
- Java实现二叉树基本操作
- 二叉树之Java实现二叉树基本操作
- 二叉树基本操作的程序实现
- 二叉树基本操作的程序实现
- 二叉树基本操作的程序实现
- 二叉树的基本操作-递归实现
- 二叉树的基本操作实现
- 二叉树的基本操作实现
- C++实现二叉树的基本操作
- 二叉树的基本操作实现
- java二叉查找树的基本操作
- 《Android开发艺术探索》之学习笔记(三)View的基础知识
- 排序算法
- 设计优化(2)代理模式
- 装载问题 回溯法解决
- RBM and NADE TO Collaborative Filtering
- Java实现二叉树的基本操作
- CSS笔记:长度单位(二)
- liunx Shell 脚本入门
- Java中参数传递问题总结
- 显著性论文学习阶段总结(一)
- poj2836 状态压缩dp
- Linux Ubuntu 能PING IP但不能PING主机域名的解决方法
- 100~200之间的素数
- 【技术前沿】微信小程序带来的冲击和新的机会?