1、二叉树的层序遍历
即按照层输出节点
1.2 按照之字型打印
即奇数行从左往右打印,偶数行从右往左打印。
那么可以借助栈先进后出的特点实现之字形打印二叉树,设两个栈 stack1,stack2,stack2为辅助栈
奇数行,从左往右打印:当前出栈节点的左节点先入栈 右节点 再入栈(从stack1出,入stack2)
偶数行,从右往左打印:当前出栈节点的右节点先入栈 左节点再入栈 (从stack1出,入stack2)
辅助栈stack2中节点出栈的顺序为下一行打印的顺序
一个简单的例子:
java实现的代码如下:
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> arrays = new ArrayList<ArrayList<Integer>>();
Stack<TreeNode> stack1 = new Stack<TreeNode>();
if(pRoot != null) {
stack1.push(pRoot);
boolean b = true;//b=true时候从左到右 b = false时候从右到左
while(!stack1.isEmpty()) {
ArrayList<Integer> array = new ArrayList<Integer>();
Stack<TreeNode> stack2 = new Stack<TreeNode>();//辅助栈 初始化
if(b) {//从左到右
while(!stack1.isEmpty()) {
TreeNode node = stack1.pop();
if(node.left != null)
stack2.push(node.left);
if(node.right != null)
stack2.push(node.right);
array.add(node.val);
}
}else {//从右到左
while(!stack1.isEmpty()) {
TreeNode node = stack1.pop();
if(node.right != null)
stack2.push(node.right);
if(node.left != null)
stack2.push(node.left);
array.add(node.val);
}
}
b = !b;
arrays.add(array);
stack1 = stack2;
}
}
return arrays;
}
1.3 层序遍历2
从上到下按层打印二叉树,每一层节点从左至右输出。
借助队列先进先出原则就可实现。(可以通过两个队列,其中一个作为辅助队列;也可以通过一个队列,同时以一个int型变量记录每一层节点数即可)
java实现的代码如下:(两个队列)
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
LinkedList<TreeNode> queue1 = new LinkedList<TreeNode>();
ArrayList<ArrayList<Integer>> arrays = new ArrayList<ArrayList<Integer>>();
if(pRoot != null) {
queue1.add(pRoot);
while(!queue1.isEmpty()) {
LinkedList<TreeNode> queue2 = new LinkedList<TreeNode>();
ArrayList<Integer> array = new ArrayList<Integer>();
while(!queue1.isEmpty()) {
TreeNode node = queue1.poll();
if(node.left != null)
queue2.add(node.left);
if(node.right != null)
queue2.add(node.right);
array.add(node.val);
}
arrays.add(array);
queue1 = queue2;
}
}
return arrays;
}
java代码实现(一个队列)
public ArrayList<ArrayList<Integer> > Print1(TreeNode pRoot) {
LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
ArrayList<ArrayList<Integer>> arrays = new ArrayList<ArrayList<Integer>>();
if(pRoot != null) {
queue.add(pRoot);
int len = 1;
while(!queue.isEmpty()) {
int val = 0;
ArrayList<Integer> array = new ArrayList<Integer>();
for(int i = 0; i < len; i++) {
TreeNode node = queue.poll();
if(node.left != null) {
queue.add(node.left);
val++;
}
if(node.right != null) {
queue.add(node.right);
val++;
}
array.add(node.val);
}
arrays.add(array);
len = val;
}
}
return arrays;
}