对于一棵二叉树,请设计一个算法,创建含有某一深度上所有结点的链表。
给定二叉树的根结点指针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)
return nullptr;
ListNode *res = new ListNode(root->val);
ListNode *p = res;//工作指针
queue<struct TreeNode*> que;
if (dep == 1)
return res;
que.push(root);
int curlevel = 1;//当前层
int ininum = 1;//初始hua层节点数
int curnum;
while(!que.empty() && curlevel < dep){
curnum = ininum;
ininum = 0;
for (int i=0; i<curnum; ++i){
//利用前一层 让当前层进队
struct TreeNode* cur = que.front();
que.pop();
if (cur->left){
//有左孩子 左孩子进队,当前层节点树+1
que.push(cur->left);
++ininum;
}
if (cur->right){
//有左孩子 左孩子进队,当前层节点树+1
que.push(cur->right);
++ininum;
}
}
++curlevel;
}
//队列中节点即为所需
while(!que.empty()){
ListNode *node = new ListNode(que.front()->val);
que.pop();
p->next = node;
p = node;
}
return res->next;
}
};