leetcode 虐我篇之(十七)Binary Tree Level Order Traversal

来源:互联网 发布:p2p监控软件 哪个最好 编辑:程序博客网 时间:2024/04/28 01:31

        二叉树的前中后序遍历都做完了,现在就到层级遍历了Binary Tree Level Order Traversal,题目描述如下:

Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).For example:Given binary tree {3,9,20,#,#,15,7},    3   / \  9  20    /  \   15   7return its level order traversal as:[  [3],  [9,20],  [15,7]]confused what "{1,#,2,3}" means? > read more on how binary tree is serialized on OJ.

        这里面的层级输出跟我们在书上看到的还不太一样,如果是直接输出的话,直接一个用一个队列保存结点,然后遍历队列,将出队列的结点的左右儿子结点继续进队列,循环直到队列为空就好。但是现在每层还要单独分出来。一开始我是想着根据二叉树的性质,每层有多少个元素然后看结点在队列中是第几个,那么满足一定条件就要换一层去存储。但是用数据模拟了一下,感觉还挺麻烦的,中间有些结点过早结束怎么办(即不是完全二叉树的时候)?纠结了好一会儿,想到,能不能再搞一个队列,先把现在这一层的结点放在第一个队列中,然后遍历队列1,将其儿子结点放在队列2中,当队列1为空的时候,那么就说明这一层结束了,准备进入下一层了。按照这个思路,代码如下:

std::vector<std::vector<int> > levelOrder(TreeNode *root){std::vector<std::vector<int> > result;std::vector<int> temp;std::queue<TreeNode *> treeQueue1,treeQueue2;if (!root){return result;}treeQueue1.push(root);TreeNode *node = NULL;while(!treeQueue1.empty() || !treeQueue2.empty()){if (!treeQueue1.empty()){node = treeQueue1.front();treeQueue1.pop();if (node->left){treeQueue2.push(node->left);}if (node->right){treeQueue2.push(node->right);}temp.push_back(node->val);}if (treeQueue1.empty()){//this means that this level is overresult.push_back(temp);temp.clear();treeQueue1.swap(treeQueue2);//swap two queue}}return result;}

        做完这道题,看了一下题解,里面有两种方法,一种跟我这个差不多,另外一种用到了递归,感觉高级很多,怎么当时我就没想到呢?!还需努力!

0 0
原创粉丝点击