import java.util.ArrayList;
import java.util.LinkedList;
/**
* 按照z字形遍历二叉树
*/
public class ZLevelOrder {
/**
* 按照Z字形访问遍历二叉树,就是在原来的层次遍历的基础上增加了一个标志位,来确定是正序还是反序加入
* @param root 二叉树
* @return 二叉树的遍历结果
*/
public static LinkedList<LinkedList<Integer>> zLevelOrder(BinaryTree root){
//保存结果的list
LinkedList<LinkedList<Integer>> result = new LinkedList<>();
//保存每一层的节点
LinkedList<BinaryTree> list = new LinkedList<>();
//标志位
boolean flag = false;
if(root == null){
return result;
}
list.add(root);
while(!list.isEmpty()){
int len = list.size();
LinkedList<Integer> nodeList = new LinkedList<>();
for(int i = 0; i < len; i ++){
BinaryTree node = list.pop();
if(node.left != null){
list.add(node.left);
}
if(node.right != null){
list.add(node.right);
}
if(flag){
nodeList.addFirst(node.value);
}else{
nodeList.add(node.value);
}
}
result.add(nodeList);
//变更标志位
flag = !flag;
}
return result;
}
public static void main(String[] args){
BinaryTree head = new BinaryTree(1);
BinaryTree left = new BinaryTree(2);
BinaryTree right = new BinaryTree(3);
BinaryTree left01 = new BinaryTree(4);
BinaryTree right01 = new BinaryTree(5);
head.left = left;
head.right = right;
left.left = left01;
left.right = right01;
System.out.println(zLevelOrder(head).toString());
}
}
//二叉树的类
class BinaryTree{
int value;
BinaryTree left;
BinaryTree right;
public BinaryTree(int value){
left = null;
right = null;
this.value = value;
}
}