N叉树层序遍历[层次遍历+size分层 || 递归遍历+level分层]

N叉树的层次遍历

  • 前言
  • 一、N叉树层次遍历
  • 二、分层遍历
    • 1、递归遍历 + level分层
    • 2、层次遍历+size分层
  • 总结
  • 参考文献

前言

层次遍历是二叉树的基本遍历,分层遍历又是二叉树层次遍历的扩展。二叉遍历和N叉遍历不过是孩子节点由2到N。通过N叉树分层遍历来练习分层的两者思想,层次遍历+size分层 || 递归遍历+level分层。

一、N叉树层次遍历

N叉树层序遍历[层次遍历+size分层 || 递归遍历+level分层]_第1张图片

二、分层遍历

1、递归遍历 + level分层

// N叉树的层序遍历。
public class LevelOrder {
    /*
    target:对普通的树进行层次遍历。
    转换为二叉树的层次遍历,区别于从left和right的判断,变成了for循环判断并加入节点到队列。
    二叉树的层次遍历,
    M1-根据level标记进入相应的层次的List。
    M2-队列+size计数来分层逐一遍历。
     */
    // M1-递归遍历 + level标记
    public List<List<Integer>> levelOrder(Node root) {
        // 初始化需要的List来存各层list
        List<List<Integer>> rs = new ArrayList<>();
        // 前序遍历 + 分层,使每个节点进入对应的list。
        preOrder(root, rs, 0);
        // 返回分层遍历的节点集。
        return rs;
    }

    // 前序遍历 + level 做到分层取值。
    private void preOrder(Node root, List<List<Integer>> rs, int level) {
        // 递归到null节点,终止此次递归。
        if (null == root) return;
        // 获取该root节点所在的list,并把该节点加入。
        List<Integer> cur = null;
        // 第一次到这么深。
        if (level >= rs.size()) rs.add(cur = new ArrayList<>());
        else cur = rs.get(level);
        // 将该节点放入对应层。
        cur.add(root.val);
        // 递归遍历。
        List<Node> next = root.children;
        for (Node node : next) preOrder(node, rs, level + 1);
    }

    // Definition for a Node.
    class Node {
        public int val;
        public List<Node> children;

        public Node() {
        }

        public Node(int _val) {
            val = _val;
        }

        public Node(int _val, List<Node> _children) {
            val = _val;
            children = _children;
        }
    }

}

2、层次遍历+size分层

// N叉树的层序遍历。
public class LevelOrder {
    /*
    target:对普通的树进行层次遍历。
    转换为二叉树的层次遍历,区别于从left和right的判断,变成了for循环判断并加入节点到队列。
    二叉树的层次遍历,
    M1-根据level标记进入相应的层次的List。
    M2-队列+size计数来分层逐一遍历。
     */
    // M1-递归遍历 + level标记
    public List<List<Integer>> levelOrder(Node root) {
        // 初始化需要的List来存各层list
        List<List<Integer>> rs = new ArrayList<>();
        // 前序遍历 + 分层,使每个节点进入对应的list。
        preOrder(root, rs, 0);
        // 返回分层遍历的节点集。
        return rs;
    }

    // 前序遍历 + level 做到分层取值。
    private void preOrder(Node root, List<List<Integer>> rs, int level) {
        // 递归到null节点,终止此次递归。
        if (null == root) return;
        // 获取该root节点所在的list,并把该节点加入。
        List<Integer> cur = null;
        // 第一次到这么深。
        if (level >= rs.size()) rs.add(cur = new ArrayList<>());
        else cur = rs.get(level);
        // 将该节点放入对应层。
        cur.add(root.val);
        // 递归遍历。
        List<Node> next = root.children;
        for (Node node : next) preOrder(node, rs, level + 1);
    }

    // Definition for a Node.
    class Node {
        public int val;
        public List<Node> children;

        public Node() {
        }

        public Node(int _val) {
            val = _val;
        }

        public Node(int _val, List<Node> _children) {
            val = _val;
            children = _children;
        }
    }

}

总结

1)树分层遍历的两者思想,层次遍历+size分层 || 递归遍历+level分层。

参考文献

[1] LeetCode N叉树层序遍历

你可能感兴趣的:(数据机构与算法,层次遍历,二叉树,N叉树,递归遍历,Java)