java实现二叉树的创建及三种遍历方式
java实现二叉树的创建及三种遍历方式
接口定义
public interface Tree { /** * 二叉树的创建 * @param arr * @return */ public List<Node> createBinTree(int[] arr); /** * 前序遍历 * @param node */ public void preOrderTraverse(Node node); /** * 中序遍历 * @param node */ public void inorderTraversal(Node node); /** * 后序遍历 * @param node */ public void postorderTraversal(Node node); }
树的节点类
public class Node { private int date; private Node leftChild; private Node rightChild; public Node(int newdate){ this.date = newdate; leftChild = null; rightChild = null; } .......get and set方法 }
接口实现类
public class TreeImpl implements Tree { @Override public List<Node> createBinTree(int[] arr) { List<Node> nodeList = new LinkedList<>(); //将所有数值转化为节点 for (int nodeIndex = 0; nodeIndex < arr.length; nodeIndex++) { nodeList.add(new Node(arr[nodeIndex])); } //对lastParentIndex-1个节点建立二叉树关系 for (int parentIndex = 0; parentIndex < arr.length / 2 - 1; parentIndex++) { //左孩子 nodeList.get(parentIndex).setLeftChild(nodeList.get(parentIndex * 2 + 1)); //右孩子 nodeList.get(parentIndex).setRightChild(nodeList.get(parentIndex * 2 + 2)); } //最后一个父节点,可能只有左孩子,拿出来单独处理 int lastParentIndex = arr.length / 2 - 1; //左孩子 nodeList.get(lastParentIndex).setLeftChild(nodeList.get(lastParentIndex * 2 + 1)); //arr的长度为奇数时,建立右孩子 if (arr.length % 2 == 1) { nodeList.get(lastParentIndex).setRightChild(nodeList.get(lastParentIndex * 2 + 2)); } return nodeList; } @Override public void preOrderTraverse(Node node) { if (node == null) { return; } System.out.print(node.getDate() + " "); preOrderTraverse(node.getLeftChild()); preOrderTraverse(node.getRightChild()); } @Override public void inorderTraversal(Node node){ if (node == null){ return; } inorderTraversal(node.getLeftChild()); System.out.print(node.getDate() + " "); inorderTraversal(node.getRightChild()); } @Override public void postorderTraversal(Node node){ if (node == null){ return; } postorderTraversal(node.getLeftChild()); postorderTraversal(node.getRightChild()); System.out.print(node.getDate() + " "); } }
测试类
public class Test { public static void main(String[] args){ Tree tree = new TreeImpl(); int[] arr = {1,2,3,4,5,6,7,8,9}; List<Node> nodeList = tree.createBinTree(arr); System.out.println("先序遍历:"); tree.preOrderTraverse(nodeList.get(0)); System.out.println(); System.out.println("中序遍历"); tree.inorderTraversal(nodeList.get(0)); System.out.println(); System.out.println("后续遍历"); tree.postorderTraversal(nodeList.get(0)); System.out.println(); } }
测试结果