关注
package problems_2016_09_28;
import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;
public class Problem_09_PrintBinaryTreeByLevelAndZigZag {
public static class Node {
public int value;
public Node left;
public Node right;
public Node(int data) {
this.value = data;
}
}
public static void printByLevel(Node head) {
if (head == null) {
return;
}
Queue<Node> queue = new LinkedList<Node>();
int level = 1;
Node last = head;
Node nLast = null;
queue.offer(head);
System.out.print("Level " + (level++) + " : ");
while (!queue.isEmpty()) {
head = queue.poll();
System.out.print(head.value + " ");
if (head.left != null) {
queue.offer(head.left);
nLast = head.left;
}
if (head.right != null) {
queue.offer(head.right);
nLast = head.right;
}
if (head == last && !queue.isEmpty()) {
System.out.print("\nLevel " + (level++) + " : ");
last = nLast;
}
}
System.out.println();
}
public static void printByZigZag(Node head) {
if (head == null) {
return;
}
Deque<Node> dq = new LinkedList<Node>();
int level = 1;
boolean lr = true;
Node cur = head;
Node last = head;
Node nLast = null;
dq.offerFirst(head);
pringLevelAndOrientation(level++, lr);
while (!dq.isEmpty()) {
if (lr) {
cur = dq.pollFirst();
if (cur.left != null) {
nLast = nLast == null ? cur.left : nLast;
dq.offerLast(cur.left);
}
if (cur.right != null) {
nLast = nLast == null ? cur.right : nLast;
dq.offerLast(cur.right);
}
} else {
cur = dq.pollLast();
if (cur.right != null) {
nLast = nLast == null ? cur.right : nLast;
dq.offerFirst(cur.right);
}
if (cur.left != null) {
nLast = nLast == null ? cur.left : nLast;
dq.offerFirst(cur.left);
}
}
System.out.print(cur.value + " ");
if (cur == last && !dq.isEmpty()) {
lr = !lr;
last = nLast;
nLast = null;
System.out.println();
pringLevelAndOrientation(level++, lr);
}
}
System.out.println();
}
public static void pringLevelAndOrientation(int level, boolean lr) {
System.out.print("Level " + level + " from ");
System.out.print(lr ? "left to right: " : "right to left: ");
}
// for test -- print tree
public static void printTree(Node head) {
System.out.println("Binary Tree:");
printInOrder(head, 0, "H", 17);
System.out.println();
}
public static void printInOrder(Node head, int height, String to, int len) {
if (head == null) {
return;
}
printInOrder(head.right, height + 1, "v", len);
String val = to + head.value + to;
int lenM = val.length();
int lenL = (len - lenM) / 2;
int lenR = len - lenM - lenL;
val = getSpace(lenL) + val + getSpace(lenR);
System.out.println(getSpace(height * len) + val);
printInOrder(head.left, height + 1, "^", len);
}
public static String getSpace(int num) {
String space = " ";
StringBuffer buf = new StringBuffer("");
for (int i = 0; i < num; i++) {
buf.append(space);
}
return buf.toString();
}
public static void main(String[] args) {
Node head = new Node(1);
head.left = new Node(2);
head.right = new Node(3);
head.left.left = new Node(4);
head.right.left = new Node(5);
head.right.right = new Node(6);
head.right.left.left = new Node(7);
head.right.left.right = new Node(8);
printTree(head);
System.out.println("===============");
printByLevel(head);
System.out.println("===============");
printByZigZag(head);
}
}
查看原帖
点赞 评论
相关推荐
牛客热帖
更多
正在热议
更多
# 科大讯飞求职进展汇总 #
258616次浏览 2593人参与
# 读研or工作,哪个性价比更高? #
23048次浏览 310人参与
# 如果重来一次你还会读研吗 #
154041次浏览 1689人参与
# 文科生还参加今年的春招吗 #
3041次浏览 27人参与
# 选择和努力,哪个更重要? #
41075次浏览 469人参与
# 长光卫星求职进展汇总 #
27453次浏览 183人参与
# 机械人选offer,最看重什么? #
68461次浏览 433人参与
# 机械制造岗投递时间线 #
19269次浏览 324人参与
# 影石Insta360求职进展汇总 #
107334次浏览 963人参与
# 如果再来一次,你还会学硬件吗 #
102416次浏览 1230人参与
# 打工人的工作餐日常 #
24579次浏览 221人参与
# 招聘要求与实际实习内容不符怎么办 #
39402次浏览 463人参与
# 如果公司降薪,你会跳槽吗? #
44108次浏览 343人参与
# 机械制造公司评价 #
98345次浏览 286人参与
# 一人推荐一个值得去的通信/硬件公司 #
160897次浏览 1734人参与
# 正在实习的你,有转正机会吗? #
335740次浏览 2689人参与
# 我的工作日记 #
52870次浏览 762人参与
# 我的国央企投递进展 #
35796次浏览 242人参与
# 小厂实习有必要去吗 #
31411次浏览 215人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
68294次浏览 494人参与