二叉树层序遍历

二叉树层序遍历

层序遍历
顺序为:按照从上到下、从左到右的顺序,依次访问所有节点

                            6
                     -------------
                     4           8
                 --------     -------
                 2      5     7     9
              --------
              1      3

如上二叉树层序遍历的结果为:(6 4 8 2 5 7 9 1 3)
将上面结果分组后对照二叉树结构图 6 (4 8) (2 5 7 9) (1 3)

层序遍历逻辑如下

1.访问跟节点6,即第一层,第一层访问结束

2.访问节点6的左子节点4, 即第二层

3.访问节点6的右子节点8, 即第二层

4.节点6 左子节点4、右子节点8 均已访问,第二层访问结束

5.第二层中节点为 (4, 8), 从左到右的次序访问,则访问节点4的 左子节点2,即第三层

6.访问节点4的右子节点5,节点4的左子节点2、右子节点5 均已访问

7.访问节点8的左子节点7,即第三层

8.访问节点8的右子节点9,节点8的左子节点7、右子节点9均已访问,第三层访问结束

9.第三层节点为 (2, 5, 7, 9),从左到右的次序访问,则访问节点 2的左子节点1,即第四层

10.访问节点2的右子节点3

11.第四层中 (5, 7, 9) 没有子节点,则第四层访问结束

12.至此二叉树中每层的节点都已访问,遍历结束

层序遍历的迭代实现如下

        // 迭代实现
        public IList<int> SequenceTraversal(TreeNode root)
        {
            // 集合存储访问到的节点值
            IList<int> list = new List<int>();
            if (null == root)
            {
                return list;
            }

            // 使用队列Queue结构(先进先出)来构建节点访问次序
            Queue<TreeNode> queue = new Queue<TreeNode>();
            // 将跟节点入队
            queue.Enqueue(root);
            while (queue.Count > 0)
            {
                // 节点出队
                TreeNode node = queue.Dequeue();
                // 将节点的值存入集合中
                list.Add(node.val);

                // 如果左子树不为空,将左子树入队
                if (null != node.left)
                {
                    queue.Enqueue(node.left);
                }

                // 如果右子树不为空,将右子树入队
                if (null != node.right)
                {
                    queue.Enqueue(node.right);
                }
            }

            return list;
        }

至此层序遍历的原理和实现均已奉上

你可能感兴趣的:(数据结构,二叉树,二叉树遍历,二叉树层序遍历)