题目描述
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
一 . 题目解析
了解过二叉树就应该知道,二叉树存在三种遍历方法:前序遍历(根→左→右)、中序遍历(左→根→右)、后续遍历(左→右→根)。
如上图所示,二叉树的基本遍历方法中并不存在题目要求的方法,因此,必须自定义一种方法实现要求。
经过思考,得出如下步骤:
(1)定义两个链表,一个作为寄存链表,一个用作与最后输出的链表。
(2)若根节点不为空,把根节点存在寄存链表里。
(3)接下来,把他放到最后输出的链表里,之后呢,如果这个节点还有左右子节点的话,把左右子节点依次存在寄存链表里面。
(4)执行(3)循环,当循环执行次数大于或者等于寄存链表的长度时,停止执行(因为每执行一次循环,就相当于把寄存链表里的数字存到输出链表里,当全搞定,自然停止。)
二 . 代码实现
using System.Collections.Generic; /* public class TreeNode { public int val; public TreeNode left; public TreeNode right; public TreeNode (int x) { val = x; } }*/ class Solution { public List<int> PrintFromTopToBottom(TreeNode root) { // write code here //定义输出链表List1和寄存链表List2 List<int> List1 = new List<int>(); List<TreeNode> List2 = new List<TreeNode>(); int i = 0; //根节点的添加方法 if (root != null) { List2.Add(root); } //(3)循环 while (i < List2.Count) { //定义一个节点Node1等于寄存链表中的第i个数 TreeNode Node1 = List2[i]; //给输出链表添加数据 List1.Add(Node1.val); //左右子节点排队进入链表List2 if (Node1.left != null) { List2.Add(Node1.left); } if (Node1.right != null) { List2.Add(Node1.right); } //i的执行次数应等于二叉树节点数 i++; } return List1; } }