/// <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); }