把二叉树打印成多行

把二叉树打印成多行

https://www.nowcoder.com/practice/445c44d982d04483b04a54f298796288?tpId=13&&tqId=11213&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

先上自己的方法,很显然是比较笨的,但是也能AC,而且效率还行:

import java.util.*;

public class Solution {
    ArrayList<ArrayList<Integer> > Print(TreeNode root) {
        ArrayList<ArrayList<Integer>> ret = new ArrayList<>();
        if (root == null)
            return ret;
        Queue<TreeNode> q1 = new LinkedList<>();
        Queue<Integer> q2 = new LinkedList<>();
        ArrayList<Integer> last = new ArrayList<>();
        ret.add(last);
        q1.offer(root);
        q2.offer(-1); // 遇到行末节点,就在q2中放-1
        int val;
        while (!q1.isEmpty()) {
            root = q1.poll();
            val = q2.poll();
            last = ret.get(ret.size() - 1);
            last.add(root.val);
            if (val != -1) {
                if (root.left != null) {
                    q1.offer(root.left);
                    q2.offer(1);
                }
                if (root.right != null) {
                    q1.offer(root.right);
                    q2.offer(1);
                }
            } else {
                if (root.left != null || root.right != null) {
                    last = new ArrayList<>();
                    ret.add(last);
                    if (root.left != null) {
                        q1.offer(root.left);
                        if (root.right != null) {
                            q2.offer(1);
                            q1.offer(root.right);
                            q2.offer(-1);
                        } else {
                            q2.offer(-1);
                        }
                    } else {
                        if (root.right != null) {
                            q1.offer(root.right);
                            q2.offer(-1);
                        }
                    }
                }
            }
        }
        return ret;
    }
}

再看题解的解法:

import java.util.*;

public class Solution {
    ArrayList<ArrayList<Integer> > Print(TreeNode root) {
        ArrayList<ArrayList<Integer>> res = new ArrayList<>();
        if(root == null)
            return res;
        Queue<TreeNode> q = new LinkedList<>();
        q.add(root);
        while(!q.isEmpty()) {
            int size = q.size(); // 记录当前层有多少个元素
            ArrayList<Integer> list = new ArrayList<>(size);
            for(int i = 0; i < size; i++) {
                root = q.poll();
                list.add(root.val);
                if(root.left != null)
                    q.add(root.left);
                if(root.right != null)
                    q.add(root.right);
            }
            res.add(list);
        }
        return res;
    }
}

也是非常直观的,巧妙就在于记录下每层的元素个数,然后多次出队把当前层的全部出队,对当前层遍历后,再将这一层的全部子节点入队,依次类推。

全部评论

相关推荐

10-19 10:28
已编辑
成都理工大学 后端工程师
团孝子已上线feeling:面了很多家公司,能感受到目前只有小公司+外包喜欢问八股。大厂虽然也问八股,但是是从实习、项目中进行提问,并且大厂会问很深,面试官也会对你的回答进行思考➕追问,所以准备大厂面试前一定要备好相关资料。对于算法,我做的是codetop前100+力扣hot100+力扣高频150,面试中实感hot100就足够,基本上只要是hot100就秒答。对于项目和八股,我做的也是烂大街的星球项目,八股则是看小林和问ai,自己也写了很多技术博客和画了很多思维导图,并且自己也尝试用嘴巴说出来,不只停留于纸面。运气也很重要,必须要让面试官/HR看到简历才行,所以建议投递时间是下午两点。tl:第一岗位9.9&nbsp;投递9.10&nbsp;一面(一面评价:最近见过最强的大三,结束五分钟后约二面,都晚上九点了不下班吗)9.11&nbsp;二面(三道算法a出两道,反问评价:经验不够等横向,我实习生要啥经验)9.21挂(实习时间过短+其他原因,想要一年实习的,为什么不招个正职)第二岗位10.10投递10.11约面(主管打电话,说看到我之前投递记录了想要我挂qa职进去干后端,同意)10.14&nbsp;一面(无八股,主动说确实很强,意愿很强)10.16&nbsp;oc其余,友邦,东软,东华,惠择,用友oc已拒京东测开一面挂(投后端被测开捞)腾讯测试已拒(投后端被测开捞)ps:表扬惠择的主管面,没怎么问技术(可能是一面面试官沟通过了),全程一起讲大道理,解答了心中很多疑惑,也告诉我以面试官角度来看怎么选候选人,如果可以下次一定选惠择
HeaoDng:美团好像可以触发一面通
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务