学java很久了,算法是硬伤,最近要找工作,突击一下算法,算法虽难,但也有神奇之处,所以记录下来,与大家分享。
import java.util.List;
import java.util.LinkedList;
public class BinaryTree {
/**
*
* @author magina_mg java实现完全二叉树的创建和递归遍历
*/
// 结点类
public class TreeNode {
TreeNode leftNode;
TreeNode rightNode;
int val;
public TreeNode(int val) {
this.val = val;
}
}
public List<TreeNode> createBinaryTree(int[] array) {
List<TreeNode> list = new LinkedList<>();
for (int i = 0; i < array.length; i++) {
list.add(new TreeNode(array[i]));
}
//建立父子关系
for (int i = 0; i < array.length/2; i++) {
// 左孩子
list.get(i).leftNode = list.get(i * 2 + 1);//二叉树性质
// 右孩子
if(i==array.length/2-1&&i%2==1){
continue;
}else {
list.get(i).rightNode = list.get(i * 2 + 2);
}
}
return list;
}
/**
* 前序遍历,递归的作用体现出来了,从方法的结构也很容易看出为什么叫前序遍历。
* @param root
*/
public void preTraverse(TreeNode root){
if(root==null){
return;
}
System.out.print(root.val+" ");
preTraverse(root.leftNode);
preTraverse(root.rightNode);
}
/**
* 中序遍历
* @param root
*/
public void midTraverse(TreeNode root){
if(root==null){
return;
}
midTraverse(root.leftNode);
System.out.print(root.val+" ");
midTraverse(root.rightNode);
}
/**
* 后序遍历
* @param root
*/
public void subTraverse(TreeNode root){
if(root==null){
return;
}
subTraverse(root.leftNode);
subTraverse(root.rightNode);
System.out.print(root.val+" ");
}
public static void main(String[] args) {
// 完全二叉树数组,逐层表示
int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 };
BinaryTree bt = new BinaryTree();
List<TreeNode> list = bt.createBinaryTree(array);
//根节点
TreeNode root = list.get(0);
System.out.println("前序遍历:");
bt.preTraverse(root);
System.out.println("\n中序遍历:");
bt.midTraverse(root);
System.out.println("\n后序遍历:");
bt.subTraverse(root);
}
}