• 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("
    ");
                    last = nlast;
                }else{
                    continue;
                }
            }
        }
    }
  • 相关阅读:
    asp.net 中theme一个意外问题
    常用的APT命令参数
    使用分布式编译incredbuild错误error C2858: commandline option 'program database name 解决方法
    使用分布式编译incredbuild错误error C2858: commandline option 'program database name 解决方法
    闻名遐迩的MySQL乱码问题(转)
    让你在职场上不可替代的12信条 30句职场箴言
    让你在职场上不可替代的12信条 30句职场箴言
    常用的APT命令参数
    [转]深入理解SET NAMES和mysql(i)_set_charset的区别
    [转]深入理解SET NAMES和mysql(i)_set_charset的区别
  • 原文地址:https://www.cnblogs.com/zsslll/p/7169938.html
Copyright © 2020-2023  润新知