树型结构是最常见的非线性结构,其中二叉树最为常见。今天我主要就是用java来实现一下树的一些常见操作。
首先需要一个用来存储树节点值的javabean:
public class TreeBean { private int nodeValue; public int getNodeValue() { return nodeValue; } public void setNodeValue(int nodeValue) { this.nodeValue = nodeValue; } }然后是树的节点bean:
public class TreeNode{ private TreeBean data; private TreeNode leftNode; private TreeNode rightNode; //构造函数 public TreeNode(){ data = new TreeBean(); } public TreeBean getData() { return data; } public void setData(TreeBean data) { this.data = data; } public TreeNode getLeftNode() { return leftNode; } public void setLeftNode(TreeNode leftNode) { this.leftNode = leftNode; } public TreeNode getRightNode() { return rightNode; } public void setRightNode(TreeNode rightNode) { this.rightNode = rightNode; } }最后是Tree的主体:
public class Tree { //树的根节点 private TreeNode root; public TreeNode getRoot() { return root; } public void setRoot(TreeNode root) { this.root = root; } //无参构造函数 Tree(){} Tree(int nodeValue){ root = new TreeNode(); TreeBean nodeBean = new TreeBean(); nodeBean.setNodeValue(nodeValue); root.setData(nodeBean); } /** * 销毁树,将树置空。 * @author letthinking * @param tree * @return */ public static Tree destroy(Tree tree){ return null; } /** * 给树插入数据 * @author letthinking * @param root * @param node */ public void insert(TreeNode root,TreeNode node){ //如果根节点为空,则赋值给根节点 if(root == null){ root = node; }else{ //该节点与它的双亲节点比较,如果小于双亲节点,就将它作为左孩子,否则为右孩子。 if(node.getData().getNodeValue() < root.getData().getNodeValue()){ //判断该节点是否为空,如果不为空就继续递归。 if(root.getLeftNode() == null){ root.setLeftNode(node); }else{ insert(root.getLeftNode(),node); } }else{ if(root.getRightNode() == null){ root.setRightNode(node); }else{ insert(root.getRightNode(),node); } } } } /** * 将树的所有节点清空 * @author letthinking * @param root 树的根节点 */ public void clearTree(TreeNode root){ if(root.getData() == null){ if(root.getLeftNode() != null){ clearTree(root.getLeftNode()); } if(root.getRightNode() != null){ clearTree(root.getRightNode()); } }else{ root.setData(null); if(root.getLeftNode() != null){ clearTree(root.getLeftNode()); } if(root.getRightNode() != null){ clearTree(root.getRightNode()); } } } /** * 前序遍历二叉树 * @author letthinking * @param root * @return */ public String middleIterator(TreeNode root){ StringBuilder str = new StringBuilder(); //判断节点是否为空 if(root == null){ return str.toString(); }else{ //输出节点的值 if(root.getData() != null){ str.append(root.getData().getNodeValue()+","); }else{ str.append("null,"); } //递归输出左孩子的值 str.append(middleIterator(root.getLeftNode())); //递归输出右孩子的值 str.append(middleIterator(root.getRightNode())); } return str.toString(); } /** * 后序遍历二叉树 * @author letthinking * @param root * @return */ public String afterIterator(TreeNode root){ StringBuilder str = new StringBuilder(); //判断节点是否为空 if(root == null){ return str.toString(); }else{ //递归输出左孩子的值 str.append(afterIterator(root.getLeftNode())); //递归输出右孩子的值 str.append(afterIterator(root.getRightNode())); //输出节点的值 if(root.getData() != null){ str.append(root.getData().getNodeValue()+","); }else{ str.append("null,"); } } return str.toString(); } /** * 求树的深度 * @author letthinking * @param node * @return */ public int treeDepth(TreeNode node){ //定义两个变量用来存储左深度和右深度 int leftDepth = 0; int rightDepth = 0; if(node == null){ return 0; }else{ leftDepth = treeDepth(node.getLeftNode())+1; rightDepth = treeDepth(node.getRightNode())+1; } //返回值最大的深度 return leftDepth>=rightDepth?leftDepth:rightDepth; } public static void main(String [] args){ //构造一个只有根节点的空树 Tree tree = new Tree(35); //创建5个节点 TreeNode treeNode = new TreeNode(); treeNode.getData().setNodeValue(23); TreeNode treeNode1 = new TreeNode(); treeNode1.getData().setNodeValue(56); TreeNode treeNode2 = new TreeNode(); treeNode2.getData().setNodeValue(45); TreeNode treeNode3 = new TreeNode(); treeNode3.getData().setNodeValue(12); TreeNode treeNode4 = new TreeNode(); treeNode4.getData().setNodeValue(37); TreeNode treeNode5 = new TreeNode(); treeNode5.getData().setNodeValue(19); //插入树中 tree.insert(tree.root, treeNode); tree.insert(tree.root, treeNode1); tree.insert(tree.root, treeNode2); tree.insert(tree.root, treeNode3); tree.insert(tree.root, treeNode4); tree.insert(tree.root, treeNode5); //前序变量 String result = tree.middleIterator(tree.getRoot()); System.out.println(result); //后序序变量 result = tree.afterIterator(tree.getRoot()); System.out.println(result); //清空数所有节点的值 tree.clearTree(tree.getRoot()); result = tree.middleIterator(tree.getRoot()); System.out.println(result); //得到树的深度 System.out.println(tree.treeDepth(tree.getRoot())); } }可能会有地方写的不对,希望大家给指出。