题目:二叉树的层序遍历

描述:给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历)
例如:给定的二叉树是{3,9,20,#,#,15,7},

该二叉树层序遍历的结果是[[3],[9,20],[15,7]]。

示例1输入:{1,2},返回值:[[1],[2]]

解法一:

思路分析:层序遍历,是将一个结点的左右节点,按照一层层的进行遍历,所以我们使用队列,先进先出,从根结点进行push到队列,如果第二层存在,就是队列出来的顺序,第二层每个执行的元素添加到队列当中,所以添加的所有结点在第二层的后面,假设pop遍历第n层的节点,每个节点会push左右两个节点进去。但是队列先进先出。它会放到队尾(下一层)。直到第n层的最后一个pop出来,第n+1层的还在队列中整齐排着,这就达到一个层序的效果。

实例分析:二叉树{3,9,20,#,#,15,7}

二叉树

3

第二层

9

20

第三层

15

7

首先我们创建队列q,将root = 3放进q中,随后对q进行判断,第一层输出[3]

再将第二层放入队列中,pop出队列,返回值[9,20]

同上,最后将第三层[15,7]返回

最终res容器中的值为[[3],[9,20],[15,7]]

具体C++代码如下所示:


/**  * struct TreeNode {  *    int val;  *    struct TreeNode *left;  *    struct TreeNode *right;  * };  */   class Solution { public:     /**      *      * @param root TreeNode类      * @return int整型vector<vector><>>      */     vector levelOrder(TreeNode* root) {         // write code here         vector res;//存放最终的结果值         if(root == NULL)             return res;         queue<treenode> q;//定义队列         q.push(root);//将根节点放进去         while(!q.empty()){             vector temp;//设立容器             int n = q.size();//队列中容器的大小             for(int i = 0; i < n;i++){ TreeNode* node = q.front();//第一个元素                 q.pop();                 temp.push_back(node->val);//将第一层的值存放到容器当中                 if(node->left != NULL)                     q.push(node->left);//将左子树放进去                 if(node->right != NULL)                     q.push(node->right);//将右子树放进去             }             res.push_back(temp);         }         return res;     } };</treenode></vector>

使用队列对每一层进行添加和存储,所以时间复杂度为O(N),空间复杂度为O(N)。


解法二:

思路分析:在方法一中,我们已经明白了只要将队列中的值一层一层遍历完成,即先遍历第一层的元素,将当前层的元素遍历完成后,再次遍历下一层队列的元素即可完成最终操作。同样我们可以由层次遍历的单层循环变为双层循环,即将内层循环重新遍历一层也可以完成相应功能。

具体java代码如下所示:
 import java.util.*;
/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */
 
public class Solution {
    /**
     *
     * @param root TreeNode类
     * @return int整型ArrayList<arraylist><>>
     */
    public ArrayList levelOrder (TreeNode root) {
        // write code here
        ArrayList res = new ArrayList<>();//创建一个链表,用于存储
        if(root == null )
            return res;
        LinkedList que = new LinkedList<>();
        que.offer(root);//用来插入指定的元素插入此优先级队列
        while(!que.isEmpty()){
            int len = que.size();
            ArrayListlist = new ArrayList<>();
            while(len > 0){
                TreeNode node = que.poll();//poll是队列数据结构实现类的方法,从队首获取元素,同时获取的这个元素将从原队列删除;
                list.add(node.val);
                if(node.left != null)
                    que.offer(node.left);
                if(node.right != null)
                    que.offer(node.right);
                len--;
            }
            res.add(list);
        }
        return res;
    }
} </arraylist>

使用java中的链表对指定元素进行插入,使用poll函数从队首获取元素,同时获取的这个元素从原队列删除,其时间复杂度为O(N),空间复杂度为O(N)。