给定一棵二叉树,设计一个算法,创建含有某一深度上所有节点的链表(比如,若一棵树的深度为 D,则会创建出 D 个链表)。返回一个包含所有深度的链表的数组。
示例:
输入:[1,2,3,4,5,null,7,8]
1
/ \
2 3
/ \ \
4 5 7
/
8
输出:[[1],[2,3],[4,5,7],[8]]
题目要求:
得到包含相同深度的链表的数组,并且不难发现,结果顺序是按照深度依次输出。
所以此题主要考察宽度优先搜索(BFS),然后需要以链表的形式返回,所以除了考察宽度
优先搜索还考察我们对于构建链表的知识是否熟悉。
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
vector<ListNode*> listOfDepth(TreeNode* tree) {
BFS(tree);
return m_res;
}
/* 宽度优先搜索 */
void BFS(TreeNode *tree){
if(tree==NULL){
return;
}
m_queue.push(tree);
/* 记录相同深度节点的数目 */
int rear =m_queue.size();
/* 建立头节点 */
ListNode* head = new ListNode(0);
ListNode* temp = head;
while(!m_queue.empty()){
TreeNode *pTree = m_queue.front();
/* 记录节点 */
temp->next = new ListNode(pTree->val);
temp = temp->next;
m_queue.pop();
rear--;
if(pTree->left){
m_queue.push(pTree->left);
}
if(pTree->right){
m_queue.push(pTree->right);
}
/* 如果当前深度节点的数目为0,将相同深度的链表存到m_res里面 */
if(rear==0){
m_res.push_back(head->next);
temp = head;
rear=m_queue.size();
}
}
}
private:
queue<TreeNode*> m_queue;
vector<ListNode*> m_res;
};
int main(){
TreeNode *root =new TreeNode(1);
TreeNode *t1 = new TreeNode(2);
TreeNode *t2 = new TreeNode(3);
TreeNode *t3 = new TreeNode(4);
TreeNode *t4 = new TreeNode(5);
TreeNode *t5 = new TreeNode(7);
TreeNode *t6 = new TreeNode(8);
root->left = t1;
root->right=t2;
t1->left = t3;
t1->right = t4;
t2->right = t5;
t3->left = t6;
Solution*ps = new Solution();
vector<ListNode*>res = ps->listOfDepth(root);
for(int i=0;i<res.size();i++){
ListNode*tmp = res[i];
while(tmp!=NULL){
cout<<tmp->val;
tmp = tmp->next;
}
cout<<endl;
}
return 0;
}