题目
实现一个函数按照“之”字型打印二叉树,即第一行按照从左到右顺序打印,第二行按照从右到左顺序打印,第三行按照从左到右顺序打印,依次类推。
例如
输出:
1
3 2
4 5 6 7
15 14 13 12 11 10 9 8
二叉树数据结构:
class TreeNode{
public int value;
public TreeNode left;
public TreeNode right;
public TreeNode(int a){
value = a;
left = null;
right = null;
}
}
思路
本题与二叉树的层序遍历有相同之处,也有不同之处。相同在于一层一层遍历,不同之处在于不同层会改变遍历顺序。
可以使用举例子的方法来思考解决方法,发现每变一层会改变顺序并且逆序输出,所以考虑用栈的结构来存储。再通过举例子发现第一层和第三层存储下一层时都是先存左节点,后存右节点。而第二层和第四层存储下一层都是先右节点后左节点,所以使用两个栈来存储。
代码
public static void print(TreeNode t) {
if (t == null) return;
Stack<TreeNode>[] stacks = new Stack[2];
stacks[0] = new Stack<>();
stacks[1] = new Stack<>();
int current = 0;
int next = 1;
stacks[current].push(t);
while(!stacks[current].isEmpty() || !stacks[next].isEmpty()){
TreeNode temp = stacks[current].pop();
System.out.print(temp.value + " ");
if(current == 0){
if(temp.left != null)stacks[next].push(temp.left);
if(temp.right != null)stacks[next].push(temp.right);
} else{
if(temp.right != null)stacks[next].push(temp.right);
if(temp.left != null)stacks[next].push(temp.left);
}
if(stacks[current].isEmpty()){
System.out.println();
current = 1 - current;
next = 1 - next;
}
}
}
测试和结果
public static void main(String args[]) {
TreeNode t1 = new TreeNode(1);
TreeNode t2 = new TreeNode(2);
TreeNode t3 = new TreeNode(3);
TreeNode t4 = new TreeNode(4);
TreeNode t5 = new TreeNode(5);
TreeNode t6 = new TreeNode(6);
TreeNode t7 = new TreeNode(7);
TreeNode t8 = new TreeNode(8);
TreeNode t9 = new TreeNode(9);
TreeNode t10 = new TreeNode(10);
TreeNode t11 = new TreeNode(11);
TreeNode t12 = new TreeNode(12);
TreeNode t13 = new TreeNode(13);
TreeNode t14 = new TreeNode(14);
TreeNode t15 = new TreeNode(15);
t1.left = t2;
t1.right = t3;
t2.left = t4;
t2.right = t5;
t3.left = t6;
t3.right = t7;
t4.left = t8;
t4.right = t9;
t5.left = t10;
t5.right = t11;
t6.left = t12;
t6.right = t13;
t7.left = t14;
t7.right = t15;
print(t1);
}
输出:
总结
对于二叉树或者图的数据结构题目,可以使用画图和举例子的方式模拟输出过程,发现规律,再根据每次循环统一的规律来编写程序。这样的方法会使分析过程更具体化。