二叉树层序遍历

〇、序

二叉树的层序遍历可借助一个队列,每出队一个结点则将该结点左右子树加入队列。

LeetCode 102.二叉树的层序遍历

一、BFS,借助队列迭代遍历

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        if (root == null) return result;
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            List<Integer> item = new ArrayList<Integer>();
            int len = queue.size();
            while (len > 0) {
                TreeNode temp = queue.poll();
                item.add(temp.val);
                if (temp.left != null) queue.offer(temp.left);
                if (temp.right != null) queue.offer(temp.right);
                --len;
            }
            result.add(item);
        }
        return result;
    }
}

二、DFS,借助栈递归遍历

public List<List<Integer>> result = new ArrayList<List<Integer>>();
public void level(TreeNode node, Integer deep) {  //deep = 0 开始
       if (node == null) return;
       deep++;
       if (result.size() < deep) {
           List<Integer> item = new ArrayList<Integer>();
           result.add(item);
       }
       result.get(deep - 1).add(node.val);
       level(node.left, deep);
       level(node.right, deep);
   }

三、练练手吧!

LeetCode 107.二叉树的层序遍历Ⅱ:与上题相类似,但是需要改变左右结点进队顺序并从List前端插入。

class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        if (root == null) return result;
        Deque<TreeNode> que = new ArrayDeque<TreeNode>();
        que.offer(root);
        while (!que.isEmpty()) {
            int len = que.size();
            List<Integer> itemList = new ArrayList<Integer>();
            while (len > 0) { 
                TreeNode tempNode = que.pop();
                itemList.add(0, tempNode.val);
                if(tempNode.right != null) que.offer(tempNode.right);
                if(tempNode.left != null) que.offer(tempNode.left);
                --len;
            }
            result.add(0, itemList);
        }
        return result;
    }
}

LeetCode 199.二叉树的右视图:同样的方法,当len==1时,可以保证为本层最后一个元素也就是从右边看到的最后一个元素,输出即可。

class Solution {
    public List<Integer> rightSideView(TreeNode root) {
        List<Integer> result = new ArrayList<Integer>();
        if (root == null) return result;
        Deque<TreeNode> que = new LinkedList<TreeNode>();
        que.offer(root);
        while (!que.isEmpty()) {
            int len = que.size();
            while (len > 0) {
                TreeNode tempNode = que.poll();
                if (len == 1) result.add(tempNode.val);
                if (tempNode.left != null) que.offer(tempNode.left);
                if (tempNode.right != null) que.offer(tempNode.right);
                --len;
            }
        }
        return result;
    }
}

LeetCode 637.二叉树的层平均值:每次循环增加一个sum存储该层结点数据和即可。

class Solution {
    public List<Double> averageOfLevels(TreeNode root) {
        List<Double> result = new ArrayList<>();
        Deque<TreeNode> que = new LinkedList<>();
        double sum;
        que.offer(root);
        while(!que.isEmpty()) {
            sum = 0.0;
            int len = que.size();
            for(int i = 0; i < len; i++) {
                TreeNode tempNode = que.poll();
                if(tempNode != null) sum += tempNode.val;
                if(tempNode.left != null) que.offer(tempNode.left);
                if(tempNode.right != null) que.offer(tempNode.right);
            }
            result.add(sum / len);
        }
        return result;
    }
}

LeetCode 429.N叉树的层序遍历:增加对孩子结点的处理。

class Solution {
    public List<List<Integer>> levelOrder(Node root) {
        List<List<Integer>> result = new ArrayList<>();
        if (root == null) return result;
        Deque<Node> que = new LinkedList<>();
        que.offer(root);
        while (!que.isEmpty()) {
            int len = que.size();
            List<Integer> itemList = new ArrayList<>();
            while (len > 0) {
                Node tempNode = que.poll();                
                itemList.add(tempNode.val);
                List<Node> child = tempNode.children;
                if (child == null || child.size() == 0) {
                    len--;
                    continue;
                }
                for (Node c : child) {
                    if (c != null) {
                        que.offer(c);
                    }
                }
                len--;
            }
            result.add(itemList);
        }
        return result;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容