1. 问题描述:
我们在编程的时候经常会遇到对于树各种遍历操作的测试,但是前提是我们要有一颗二叉树来这样才可以进行遍历,下面使用递归的方式来建立一颗完全二叉树
2. 思路分析:
① 我们先可以创建一个数组,里面存放的是若干个元素这样我们就可以利用根节点与左右孩子节点之间的关系来创建一棵完全二叉树
假设根节点的编号为i,根节点下假如有左孩子那么左孩子的编号为2 * 1 +1,根节点下假如有右孩子那么右孩子的编号为2 * 1 + 2,这样就可以根据数组下标来进行完全二叉树的创建
② 我们可以递归创建,递归创建左子树与右子树,每一个节点都可以看成是一颗二叉树,所以每一个节点都尝试去建立自己的左右子树,所以在递归的时候我们需要加上一个if判断看一下当前索引是否超过了数组的长度,假如不超过我们才往下进行创建左右子树,if判断同时也起到了一个递归的终止条件的作用方式,可以防止数组越界的问题的发生
③ 在递归调用层层返回的时候最终返回来的是根节点,所以我们接下来就可以以根节点为起点进行遍历操作
3. 下面是具体的代码:
public class Main {
/*
* 3
* 56 23
* 78 12 67 100
* 2
*
* */
public static void main(String[] args) {
int arr[] = {3, 56, 23, 78, 12, 67, 100, 2};
TreeNode<Integer> root = createCompleteTree(arr, 0);
inOrder(root);
}
//利用根节点与左右孩子节点之间的关系来创建二叉树
private static TreeNode<Integer> createCompleteTree(int[] arr, int index) {
TreeNode<Integer> newNode = null;
if(index < arr.length){
newNode = new TreeNode<Integer>(arr[index]);
newNode.left = createCompleteTree(arr, 2 * index + 1);
newNode.right = createCompleteTree(arr, 2 * index + 2);
}
return newNode;
}
private static void inOrder(TreeNode<Integer> node) {
if(node == null) return;
inOrder(node.left);
System.out.print(node.value + " ");
inOrder(node.right);
}
public static class TreeNode<T>{
TreeNode<T> left;
TreeNode<T> right;
T value;
public TreeNode(T value) {
super();
this.value = value;
}
}
}