给定一个确定的数组,然后构建一棵二叉树,并分别使用递归和非递归的方式进行遍历。
import java.util.LinkedList;
import java.util.List;
import java.util.Stack;
/**
* 建树思路:
* 首先把所有的数创建为节点依次存入有序集合中
* 对于数列中的前 n/2-1 个都为父节点,因此遍历父节点构建树
* 每一个父节点都创建对应的孩子(左孩子:父节点*2+1;右孩子:父节点*2+2)
* 对于最后一个父节点(即下标是 n*2-1 的节点)根据数列个数的奇偶值判断有没有右孩子
* 最后返回根节点(存入的第一个数)
*/
public class BinaryTree {
// 先序遍历:
// 1 2 4 8 9 5 3 6 7
// 中序遍历:
// 8 4 9 2 5 1 6 3 7
// 后序遍历:
// 8 9 4 5 2 6 7 3 1
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7,8,9};
Node root = createBinTree(arr);
System.out.println("\n先序遍历的结果(递归):");
preOrderTraverse(root);
System.out.println("\n先序遍历的结果(非递归):");
preOrderTraverse2(root);
}
private static void preOrderTraverse2(Node root) {
Stack<Node> stack = new Stack<>();
stack.add(root);
while(!stack.isEmpty()) {
Node t = stack.pop();
while(t != null) {
System.out.print(t.data + " ");
if(t.rChild != null)
stack.push(t.rChild);
t = t.lChild; //必须在右孩子入栈之后,否则右孩子不再是原来t的右孩子
}
}
}
private static void preOrderTraverse(Node root) {
if(root == null)
return ;
System.out.print(root.data+" ");
preOrderTraverse(root.lChild);
preOrderTraverse(root.rChild);
}
private static Node createBinTree(int[] arr) {
List<Node> list = new LinkedList<Node>();
int len = arr.length;
for(int i=0; i<len; i++) {
list.add(new Node(arr[i]));
}
for(int i=0; i<len/2-1; i++) {
list.get(i).lChild = list.get(i*2+1);
list.get(i).rChild = list.get(i*2+2);
}
//最后一个父节点需要特判(当数列为奇数时才可以有右孩子)
int lastIndex = len / 2 - 1;
list.get(lastIndex).lChild = list.get(lastIndex*2+1);
if(len % 2 == 1)
list.get(lastIndex).rChild = list.get(lastIndex*2+2);
//返回根节点
return list.get(0);
}
private static class Node{
int data;
Node lChild;
Node rChild;
public Node(int data) {
super();
this.data = data;
this.lChild = null;
this.rChild = null;
}
}
}
运行结果:
阅读了很多网上的博客才整理出来的,如有错误或者不合理的地方,敬请指正哦~
坚持!!!