二叉树的层序遍历

Binary_Tree_Level_traverse

java

public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res = new LinkedList<>();
        if (root == null) {
            return res;
        }
        //
        // 层次遍历序列: 1 2 3 4 5 6
        Queue<TreeNode> q = new LinkedList<>();
        // 将根结点加入到新建的队列当中
        // add(1)
        q.add(root);
        while (!q.isEmpty()) {
            // 每一层结点的个数
            // size = 1
            int size = q.size();
            // 用于存储每层结点的值

            List<Integer> level = new LinkedList<>();
            // 每一个循环的内容对应每一层中的每个结点
            for (int i = 0; i < size; i++) {

                TreeNode current = q.poll();
                // level.add(1)
                level.add(current.val);
                // 下一层q.add(2, 3)
                if (current.left != null) {
                    q.add(current.left);
                }
                if (current.right != null) {
                    q.add(current.right);
                }
            }
            res.add(level);
        }
        return res;
    }

go

func levelOrder(root *TreeNode) [][]int {
	res := [][]int{}
	if root == nil {
		return res
	}
	// 新建一个队列,用于存储
	q := []*TreeNode{root}
	// 直到队列为空为止
	for len(q) > 0 {
		// 存储每一层的结点的值
		level := []int{}
		// size为当前层的结点的个数
		size := len(q)
		for i := 0; i < size; i++ {
			current := q[0]
			// 将结点加入到level
			level = append(level, current.Val)
			// poll出去
			q = q[1:]
			if current.Left != nil {
				q = append(q, current.Left)
			}
			if current.Right != nil {
				q = append(q, current.Right)
			}
		}
		res = append(res, level)

	}
	return res
}

c++

//
// Created by xiaoz on 2022/11/23.
//
#include <iostream>
#include "build_tree.cpp"
#include <queue>
using namespace std;

class LevelTraverse {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> res = {};
        if (!root) {
            return res;
        }
        queue<TreeNode*> q;
        q.push(root);
        while(!q.empty()) {
            int size = q.size();
            vector<int> level;
            for (int i = 0; i < size; i++) {
                TreeNode* current = q.front();
                q.pop();
                level.push_back(current->val);
                if (current->left) {
                    q.push(current->left);
                }
                if (current->right) {
                    q.push(current->right);
                }
            }
            res.push_back(level);
        }
        return res;
    }
};


int main() {
    BuildTree build;
    LevelTraverse test;
    vector<int> preorder = {1, 2, 5, 4, 6, 7, 3, 8, 9};
    vector<int> inorder = {5, 2, 6, 4, 7, 1, 8, 3, 9};
    TreeNode* root = build.buildTreeFromPreAndIn(preorder, inorder);
    vector<vector<int>> res = test.levelOrder(root);
    for (vector<int>item : res) {
        for (int i : item) {
            cout<<i;
        }
        cout<<endl;
    }
    return 0;
}

python

from typing import Optional, List

from data_algo.algo.tree.TreeNode import TreeNode
from data_algo.algo.tree.build_tree import BuildTree


class BinaryTreeLevelTraverse:
    def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        if root is None:
            return []
        queue = [root]
        res = []
        # 每一次while循环就是一层
        # 纵向
        while queue:
            level = []
            size = len(queue)
            # 所有的for循环是每一层中的内容
            # 横向
            for i in range(size):
                current = queue[0]
                level.append(current.val)
                queue.pop(0)
                # queue.pop() 这是默认返回最后一个
                if current.left is not None:
                    queue.append(current.left)
                if current.right is not None:
                    queue.append(current.right)
            res.append(level)
        return res

if __name__ == "__main__":
    # 创建一棵树
    preorder = (1, 2, 5, 4, 6, 7, 3, 8, 9)
    inorder = (5, 2, 6, 4, 7, 1, 8, 3, 9)
    build = BuildTree()
    tree = build.buildTree(preorder, inorder)
    test = BinaryTreeLevelTraverse()
    levelRes = test.levelOrder(tree)
    print(levelRes)