java实现二叉树的常见操作

来源:互联网 发布:自学php百度云 编辑:程序博客网 时间:2024/05/01 10:33

       树型结构是最常见的非线性结构,其中二叉树最为常见。今天我主要就是用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())); }}
       可能会有地方写的不对,希望大家给指出。



原创粉丝点击