二叉树的左视图
@TOC二叉树的左视图
二叉树的左视图
本人画的图,略丑,(灵魂画手~~)二叉树的左视图就是从二叉树左边看这棵树,你能看到的结点。这个图在下面的代码作为测试用例。
本文使用的是两个队列来实现,实现思路如下:
层次遍历的基础上实现打印每层的第一个元素。
(队列1打印第一层首元素,队列2打印第二层首元素,队列1打印第三层…)
新建队列1,队列2,。
1>根节点进入第一个队列。
2>使用队列的peek()方法打印每层的第一个元素。
3>将队列1的元素依次出列(完全出列),依次出列的元素的左孩子和右孩子进入队列2
二叉树的左视图代码
class Solution{
public void leftView(ListNode root) {
Queue<ListNode> qu1 = new LinkedList<>();
Queue<ListNode> qu2 = new LinkedList<>();
qu1.add(root);
while (!qu1.isEmpty() || !qu2.isEmpty()) {
Queue<ListNode> qu;
Queue<ListNode> quTemp;
if (qu1.isEmpty()) {
qu = qu2;
quTemp=qu1;
} else {
qu = qu1;
quTemp=qu2;
}
System.out.println(qu.peek().val);
while (!qu.isEmpty()) {
ListNode temp = qu.poll();
if (temp.left != null) {
quTemp.add(temp.left);
}
if (temp.right != null) {
quTemp.add(temp.right);
}
}
}
}
}
//测试类:测试用例使用的是本文一开始上的图
import java.util.LinkedList;
import java.util.Queue;
public class Main {
public static void main(String[] args) {
ListNode root = new ListNode(1);
ListNode r2 = new ListNode(2);
ListNode r3 = new ListNode(3);
ListNode r4 = new ListNode(4);
ListNode r5 = new ListNode(5);
ListNode r6 = new ListNode(6);
ListNode r7 = new ListNode(7);
ListNode r8 = new ListNode(8);
ListNode r9 = new ListNode(9);
ListNode r10 = new ListNode(10);
ListNode r11 = new ListNode(11);
ListNode r12 = new ListNode(12);
ListNode r13 = new ListNode(13);
ListNode r14 = new ListNode(14);
ListNode r15 = new ListNode(15);
root.left = r2;
root.right = r3;
r2.left = r4;
r2.right = r5;
r3.left = r6;
r3.right = r7;
r4.left = r8;
r4.right = r9;
r9.left = r10;
r6.left = r11;
r7.right=r12;
r12.right=r13;
r13.right=r14;
r14.right=r15;
new Solution().leftView(root);
}
}
class ListNode {
int val;
ListNode left = null;
ListNode right = null;
ListNode(int val) {
this.val = val;
}
}
/*结果打印:
1
2
4
8
10
14
15
*/