示例#1
0
        /// <summary>
        /// 层序遍历
        /// 广度优先的思想
        /// </summary>
        /// <returns></returns>
        public QueueList <TKey> layerErgodic()
        {
            // 定义两个队列, 分别存储树中的键,和树中的节点
            QueueList <Node> nodes = new QueueList <Node>();
            QueueList <TKey> keys  = new QueueList <TKey>();

            // 默认往队列中放入根节点
            nodes.enqueue(this.root);
            while (!nodes.isEmpty())
            {
                // 从 nodes队列中弹出节点,把键放到keys中
                Node n = nodes.dequeue();
                keys.enqueue(n.key);
                // 判断当前节点有没有左子节点, 有:放入nodes中
                if (n.left != null)
                {
                    nodes.enqueue(n.left);
                }
                // 判断当前节点有没有右子节点,有:放入nodes中
                if (n.right != null)
                {
                    nodes.enqueue(n.right);
                }
            }
            return(keys);
        }
        /// <summary>
        /// 折纸问题
        /// </summary>
        private static void PagerFolderTest()
        {
            // 模拟折纸 生成树
            int count = 3;
            // 定义根节点
            Node <string> root = null;

            for (int i = 0; i < count; i++)
            {
                if (i == 0)
                {
                    root = new Node <string>("down", null, null);
                    continue;
                }
                // 当前不是第一次对折
                // 定义一个辅助队列, 通过层序遍历的思想,找到叶子节点,叶子节点添加子节点
                QueueList <Node <string> > queue = new QueueList <Node <string> >();
                queue.enqueue(root);
                while (!queue.isEmpty())
                {
                    // 从队列中弹出一个节点
                    Node <string> temp = queue.dequeue();
                    // 如果有左子节点 或 右子节点,把子节点放到队列中
                    if (temp.left != null)
                    {
                        queue.enqueue(temp.left);
                    }
                    if (temp.right != null)
                    {
                        queue.enqueue(temp.right);
                    }
                    // 如果没有子节点, 则需要该节点添加左子节点和右子节点
                    if (temp.left == null && temp.right == null)
                    {
                        temp.left  = new Node <string>("down", null, null);
                        temp.right = new Node <string>("up", null, null);
                    }
                }
            } // create root tree

            // 遍历树 (中序遍历) 打印每个节点
            printTree(root);
        }