java宽度搜索打印二叉树
摘要:看牛客中左程云的讲座而写的一个小例子。
题目:
给定一个二叉树,请按照以下格式打印二叉树.
打印格式:
1
23
456
78
解题思路:
设定2个变量last用来记录当前打印节点的最右节点, nlast 用来记录下一行的最右节点。
queue队列,用来存储将要打印的节点。
1、 另节点1入栈 last等于节点一 然后另节点一出栈。 |
|
2
另节点一得子节点2入栈 nlast更新为节点2 另节点1得右节点3入栈 更新nlast为节点3. |
|
3
此时打印第一步中出栈得节点1 并用节点1和last比较 节点1正好和last相同 打印换行 更新last = nlast |
|
4
将节点2出队 并将节点2的子节点4放入队列中 更新nlast=节点4 |
|
5 | 打印上次出队的节点2,并比较节点2是否等于nlast,不相等continue |
6
节点3出队 然后将节点3的子节点放入队列 并更新nlast=节点6 |
|
7 打印上次出队的节点3并 比较是否和last节点相同 相同则更新last=nlas |
|
总结:
1、节点出队,并将该节点的子节点入队,更新nlast
2、打印出队的节点,并比较打印的节点是否和last节点一样,如果相等则打印换行,否则continue。
源码:
package ss.entity; public class TreeNode { int val; TreeNode left; TreeNode right; public int getVal() { return val; } public void setVal(int val) { this.val = val; } public TreeNode getLeft() { return left; } public void setLeft(TreeNode left) { this.left = left; } public TreeNode getRight() { return right; } public void setRight(TreeNode right) { this.right = right; } public TreeNode(int x) { val = x; } public boolean equals(Object obj) { return super.equals(obj); } }
package ss.tree; import java.util.LinkedList; import java.util.Queue; import ss.entity.TreeNode; /** * 二叉树按层遍历 * * 给定一颗二叉树头结点head, 按照以下格式答应 * * 1 * / \ * 2 3 * / / \ * 4 5 6 * / \ * 7 8 * 需要打印的格式为: * 1 * 23 * 456 * 78 * @author zhangss 2017-07-12 * */ public class TreeDemo01 { public static void main(String[] args){ TreeNode tree = new TreeNode(1); tree.setLeft(new TreeNode(2)); tree.setRight(new TreeNode(3)); tree.getLeft().setLeft(new TreeNode(4)); tree.getRight().setLeft(new TreeNode(5)); tree.getRight().setRight(new TreeNode(6)); tree.getRight().getLeft().setLeft(new TreeNode(7)); tree.getRight().getLeft().setRight(new TreeNode(8)); TreeDemo01.printTree(tree); } public static void printTree(TreeNode tree){ Queue queue = new LinkedList(); TreeNode last = null; TreeNode nlast = null; TreeNode tmpNode = null; queue.add(tree); last = tree; while(!queue.isEmpty()){ tmpNode = (TreeNode)queue.poll(); if(null != tmpNode.getLeft()){ queue.add(tmpNode.getLeft()); nlast = tmpNode.getLeft(); } if(null != tmpNode.getRight()){ queue.add(tmpNode.getRight()); nlast = tmpNode.getRight(); } System.out.print(tmpNode.getVal()); if(tmpNode.equals(last)){ System.out.print("\n"); last = nlast; }else{ continue; } } } }