請實現(xiàn)一個函數(shù)按照之字形順序打印二叉樹,即第一行按照從左到右1的順序打印,第二層按照從右到左的順序打印,第三行再按照從左到右的1順序打印,其他行以此類推。
?
例如:下面一棵二叉樹:

?
按照之字形打印的結(jié)果:
?

?
分析:
規(guī)律:按之字形順序打印二叉樹需要兩個棧。我們在打印某一層的節(jié)點時,把下一層的子節(jié)點保存到相應(yīng)的棧里。
如果當(dāng)前打印的是奇數(shù)層(第一層、第三層等),則先保存左子節(jié)點再保存右子節(jié)點到第一個棧里;
如果當(dāng)前打印的是偶數(shù)層(第二層、第四層等),則先保存右子節(jié)點再保存左子節(jié)點到第二個棧里。
?
由此代碼為:
?
import java.util.Stack;
/*按之字形打印二叉樹*/
public class Solution_32_03 {
//之字形打印二叉樹的函數(shù)
public static void Print(TreeNode pRoot) {
if (pRoot == null) {//當(dāng)節(jié)點為空時
return ;
}
//存奇數(shù)層的節(jié)點
Stack<TreeNode> stack1 = new Stack<TreeNode>();
//存偶數(shù)層的節(jié)點
Stack<TreeNode> stack2 = new Stack<TreeNode>();
//層數(shù)
int layer = 1;
//將根結(jié)點先 push 進(jìn) stack1 中
stack1.push(pRoot);
// stack1 或 stack2 有一個不為空時,執(zhí)行下面的代碼
while (!stack1.isEmpty() || !stack2.isEmpty()) {
if (layer % 2 != 0) {//當(dāng)前層數(shù)為奇數(shù)層
while (!stack1.isEmpty()) {//消耗 stack1 中的節(jié)點
TreeNode node = stack1.pop();
System.out.print(node.val+" , ");
//如果當(dāng)前層為奇數(shù)層,則它子節(jié)點進(jìn)棧的順序是:左孩子先進(jìn),右孩子再進(jìn)
if (node.left != null) {
stack2.push(node.left);
}
if (node.right != null) {
stack2.push(node.right);
}
}
//當(dāng)前層的節(jié)點消耗完成,層數(shù)加 1
layer++;
//換行
System.out.println();
}else {//當(dāng)前層數(shù)為偶數(shù)層
while (!stack2.isEmpty()) {//消耗 stack2 中的節(jié)點
TreeNode node = stack2.pop();
System.out.print(node.val+" , ");
//如果當(dāng)前層為偶數(shù)層,則它子節(jié)點進(jìn)棧的順序是:右孩子先進(jìn),左孩子再進(jìn)
if (node.right != null) {
stack1.push(node.right);
}
if (node.left != null) {
stack1.push(node.left);
}
}
//當(dāng)前層的節(jié)點消耗完成,層數(shù)加 1
layer++;
//換行
System.out.println();
}
}
}
//二叉樹的節(jié)點
public static class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
//測試主函數(shù)
public static void main(String[] args) {
TreeNode root1 = new TreeNode(1);
root1.left = new TreeNode(2);
root1.right = new TreeNode(3);
root1.left.left = new TreeNode(4);
root1.left.right = new TreeNode(5);
root1.right.left = new TreeNode(6);
root1.right.right = new TreeNode(7);
root1.left.left.left = new TreeNode(8);
root1.left.left.right = new TreeNode(9);
root1.left.right.left = new TreeNode(10);
root1.left.right.right = new TreeNode(11);
root1.right.left.left = new TreeNode(12);
root1.right.left.right = new TreeNode(13);
root1.right.right.left = new TreeNode(14);
root1.right.right.right = new TreeNode(15);
Solution_32_03.Print(root1);
}
}
?
輸出結(jié)果:
?
