按之字形打印二叉树

时间:2021-02-26 17:27:50

题目描述

请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

算法解析:
对于一个二叉树[8][6, 10][5, 7, 9, 11],我们按照之字形打印二叉树,也就是说如果我们打印了根结点8的话,我们接下来的一层需要先打印10,在打印6,这有点像栈的特性,所以我们考虑在打印根结点的同时,按照先左子树后右子树的顺序将根节点的子节点放置到栈里边。在打印第三层的时候,我们需要从左到右打印,这时候需要我们将第二层的子节点按照先右子节点后左子节点的顺序放入栈。

代码如下:

   public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> result = new ArrayList<>();
if (pRoot == null){
return result;
}
Stack<TreeNode> stack = new Stack<>();
int current = 0;
stack.push(pRoot);
while (!stack.empty()){
Stack<TreeNode> temp = new Stack<>();
ArrayList<Integer> data = new ArrayList<>();
TreeNode node = null;
while (!stack.empty()){
node = stack.pop();
data.add(node.val);
if (current % 2 == 0){
//先添加左子树,在添加右子树
if (node.left != null){
temp.push(node.left);
}
if (node.right != null){
temp.push(node.right);
}
}else{
//先添加右子树,在添加左子树
if (node.right != null){
temp.push(node.right);
}
if (node.left != null){
temp.push(node.left);
}
}
}
result.add(data);
current ++;
stack = temp;
}
return result;
}