#include<iostream>
using namespace std;
/**
对于一棵二叉树,请设计一个算法,
创建含有某一深度上所有结点的链表。
给定二叉树的根结点指针TreeNode* root,以及链表上结点的深度,
请返回一个链表ListNode,代表该深度上所有结点的值,
请按树上从左往右的顺序链接,
保证深度不超过树的高度,
树上结点的值为非负整数且不超过100000。
算法:对二叉树进行层序遍历,在同一层的所有节点将被取出
并取出对应节点的数值,创建新的链表节点对象,添加到链表中去
二叉树的深度:
二叉树的根节点深度为1
**/
#include<vector>
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
//根节点的深度为1
ListNode* pHead=new ListNode(0);
ListNode* p=pHead;
if(dep==0){
return pHead->next;
}
vector<TreeNode*> helper_queue;
vector<int> helper_depth;
// 最终helper_queue剩下的都是depth=dep的二叉树中的节点
helper_queue.push_back(root);
helper_depth.push_back(0);
TreeNode *temp_node;
int temp_depth;
while(helper_queue.size()>0){
if(helper_depth[0]==dep){
break;
}
temp_node=helper_queue[0];
temp_depth=helper_depth[0];
helper_queue.erase(helper_queue.begin());
helper_depth.erase(helper_depth.begin());
if(temp_node->left!=NULL){
helper_queue.push_back(temp_node->left);
helper_depth.push_back(temp_depth+1);
}
if(temp_node->right!=NULL){
helper_queue.push_back(temp_node->right);
helper_depth.push_back(temp_depth+1);
}
}
// 从辅助队列的队列头部(index=0)开始读取出树中的节点
for(unsigned int i=0;i<helper_queue.size();i++){
ListNode* new_node=new ListNode(helper_queue[i]->val);
p->next=new_node;
p=p->next;
}
return pHead->next;
}
};