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

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

 

posted @ 2017-07-16 14:15  xiaoss  阅读(1303)  评论(0编辑  收藏  举报