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;
}