?LeetCode里涉及到二叉树的题都是采用了形如[1,2,3,4,NULL,5,NULL]
这样的格式作为输入,其中NULL就表示该节点为空节点。LeetCode并没有给出如何通过这样一个数组进行二叉树的构建,但我们通过分析可以发现这实际上就是一个对二叉树的层次遍历过程,只不过空的叶子节点使用了NULL来进行占位。
?为了方便在本地进行Debug,我们可以依据这一流程自己构造对应的二叉树。考虑到这一格式输入本身就是某种意义上的层次遍历,因此我们也只需要以层次遍历的方式来建树即可。层次遍历的写法中,我们是初始化了一个队列,循环地在每一层执行从左到右输出,从左到右子节点入队列的操作,代码为:
vector<vector<int>> result;
queue<TreeNode*> que;
if(root) que.push(root);
while(!que.empty()){
vector<int> cur;
int size=que.size();
for(;size>0;size--){
TreeNode* temp=que.front();
que.pop();
cur.push_back(temp->val);
if(temp->left) que.push(temp->left);
if(temp->right) que.push(temp->right);
}
result.push_back(cur);
}
return result;
?同理,我们也利用队列以层次遍历的方式来实现二叉树的构造。同样是遍历每一层,依据前一层的大小size
来决定本层操作要从输入vector
中读取多少个元素来构造子节点,每次构造的顺序为从左至右。考虑到输入使用了NULL来进行占位,使用迭代器遍历时读出的(*it)==0
,因此我们要对这个空节点进行额外判断,如果为0
,则当前处理节点的子节点为空,否则new一个值为(*it)
的子节点。其余逻辑比较简单,不再赘述。具体代码见下:
class TreeNode{
public:
int val;
TreeNode* left;
TreeNode* right;
TreeNode():val(0),left(NULL),right(NULL){}
TreeNode(int v):val(v),left(NULL),right(NULL){}
};
TreeNode* CreatTree(vector<int> input){
TreeNode* root;
queue<TreeNode*> que;
vector<int>::iterator it=input.begin();
if(!input.empty()){
root = new TreeNode(*(it++));
que.push(root);
}
while(!que.empty() && it!=input.end()){
int size=que.size();
for(;size--;size>0){
TreeNode* temp=que.front();
que.pop();
TreeNode* left=nullptr;
TreeNode* right=nullptr;
if (*it) {
left = new TreeNode(*(it++));
} else {
it++;
}
if (*it) {
right = new TreeNode(*(it++));
} else {
it++;
}
temp->left=left;
temp->right=right;
if(left) que.push(left);
if(right) que.push(right);
}
}
return root;
}