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();
}
}
测试结果