1.题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
2.算法描述
用两个栈搞定超级简单,栈是起反序作用的。
1.
初
始
化
两
个
栈
s
1
,
s
2
,
s
1
用
来
装
奇
数
层
的
结
点
,
s
2
用
来
装
偶
数
层
的
结
点
。
初
始
化
一
个
a
n
s
用
来
装
最
终
的
答
案
。
1.初始化两个栈s1,s2,s1用来装奇数层的结点,s2用来装偶数层的结点。初始化一个ans用来装最终的答案。
1.初始化两个栈s1,s2,s1用来装奇数层的结点,s2用来装偶数层的结点。初始化一个ans用来装最终的答案。
2.
初
始
时
,
根
节
点
入
栈
s
1.
2.初始时,根节点入栈s1.
2.初始时,根节点入栈s1.
3.
当
s
1
,
s
2
有
一
个
不
为
空
时
,
执
行
以
下
操
作
:
3.当s1,s2有一个不为空时,执行以下操作:
3.当s1,s2有一个不为空时,执行以下操作:
3.1.
初
始
化
一
个
临
时
l
i
s
t
用
来
装
s
1
中
的
结
点
,
当
s
1
不
空
时
,
弹
出
s
1
中
结
点
时
,
\red{\ \ \ \ 3.1.初始化一个临时list用来装s1中的结点,当s1不空时,弹出s1中结点时,}
3.1.初始化一个临时list用来装s1中的结点,当s1不空时,弹出s1中结点时,
将
结
点
值
装
入
临
时
l
i
s
t
,
将
结
点
的
子
结
点
以
“
左
右
”
的
顺
序
入
栈
s
2
;
然
后
临
时
l
i
s
t
加
入
到
a
n
s
中
\red{\ \ \ \ \ \ \ 将结点值装入临时list,将结点的子结点以“左右”的顺序入栈s2;然后临时list加入到ans中}
将结点值装入临时list,将结点的子结点以“左右”的顺序入栈s2;然后临时list加入到ans中
则
s
2
中
的
结
点
出
栈
的
时
候
是
从
偶
数
层
的
最
右
端
开
始
以
"
右
左
"
的
顺
序
弹
出
的
。
则s2中的结点出栈的时候是从偶数层的最右端开始以"右左"的顺序弹出的。
则s2中的结点出栈的时候是从偶数层的最右端开始以"右左"的顺序弹出的。
3.2.
初
始
化
一
个
临
时
l
i
s
t
用
来
装
s
2
中
的
结
点
,
当
s
2
不
空
时
,
弹
出
s
2
中
结
点
时
,
\red{\ \ \ \ 3.2.初始化一个临时list用来装s2中的结点,当s2不空时,弹出s2中结点时,}
3.2.初始化一个临时list用来装s2中的结点,当s2不空时,弹出s2中结点时,
将
结
点
值
装
入
临
时
l
i
s
t
,
将
结
点
的
子
结
点
以
“
右
左
”
的
顺
序
入
栈
s
1
;
然
后
临
时
l
i
s
t
加
入
到
a
n
s
中
\red{\ \ \ \ \ \ \ \ 将结点值装入临时list,将结点的子结点以“右左”的顺序入栈s1;然后临时list加入到ans中}
将结点值装入临时list,将结点的子结点以“右左”的顺序入栈s1;然后临时list加入到ans中
则
s
1
中
的
结
点
出
栈
的
时
候
是
从
奇
数
层
的
最
左
端
开
始
以
"
左
右
"
的
顺
序
弹
出
的
。
则s1中的结点出栈的时候是从奇数层的最左端开始以"左右"的顺序弹出的。
则s1中的结点出栈的时候是从奇数层的最左端开始以"左右"的顺序弹出的。
3.代码描述
3.1.Java代码
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
import java.util.*;
public class Solution {
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> ans = new ArrayList<>();
if(pRoot==null)
return ans;
Stack<TreeNode> s1 = new Stack<>();//装奇数层的结点
Stack<TreeNode> s2 = new Stack<>();//装偶数层的结点
s1.push(pRoot);
ArrayList<Integer> row = null;
while(!s1.isEmpty()||!s2.isEmpty()){
row = new ArrayList<>();
while(!s1.isEmpty()){
TreeNode node = s1.pop();
row.add(node.val);
//以“左右”的顺序入栈
if(node.left!=null)
s2.push(node.left);
if(node.right!=null)
s2.push(node.right);
}
if(!row.isEmpty())
ans.add(row);
row = new ArrayList<>();
while(!s2.isEmpty()){
TreeNode node = s2.pop();
row.add(node.val);
//以“右左”的顺序入栈
if(node.right!=null)
s1.push(node.right);
if(node.left!=null)
s1.push(node.left);
}
if(!row.isEmpty())
ans.add(row);
}
return ans;
}
}
3.2.Python代码
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def Print(self, pRoot):
ans = []
if not pRoot:
return ans
s1 = []
s2 = []
s1.append(pRoot)
while s1 or s2:
row = []
while s1:
node = s1.pop()
row.append(node.val)
if node.left:
s2.append(node.left)
if node.right:
s2.append(node.right)
if row:
ans.append(row)
row = []
while s2:
node = s2.pop()
row.append(node.val)
if node.right:
s1.append(node.right)
if node.left:
s1.append(node.left)
if row:
ans.append(row)
return ans