【 声明:版权所有,转载请标明出处,请勿用于商业用途。 联系信箱:libin493073668@sina.com】
题目描述
对于一棵二叉树,请设计一个算法,创建含有某一深度上所有结点的链表。
给定二叉树的根结点指针TreeNode* root,以及链表上结点的深度,请返回一个链表ListNode,代表该深度上所有结点的值,请按树上从左往右的顺序链接,保证深度不超过树的高度,树上结点的值为非负整数且不超过100000。
思路
如果之前做过类似的题目,那这道题其实也很简单了,遍历方法无非就是深度优先与广度优先,对于这道题深度优先肯定是不行的,我们知道广度优先是发散性的行走,所以我们可以使用广度优先来完成这道题,将所有同层的结点保存在队列之中。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
class TreeLevel
{
public:
ListNode* getTreeLevel(TreeNode* root, int dep)
{
// write code here
if(root==nullptr)
return nullptr;
queue<TreeNode*> Q,tmp;
Q.push(root);
int cnt = 1;
ListNode *newList = new ListNode(0);
ListNode *pNode = newList;
while(!Q.empty())
{
if(cnt==dep)
{
while(!Q.empty())
{
ListNode *newNode = new ListNode(Q.front()->val);
Q.pop();
pNode->next = newNode;
pNode = pNode->next;
}
}
while(!Q.empty())
{
TreeNode *cur = Q.front();
Q.pop();
tmp.push(cur->left);
tmp.push(cur->right);
}
while(!tmp.empty())
{
Q.push(tmp.front());
tmp.pop();
}
++cnt;
}
return newList->next;
}
};