我想将二叉树存储在数组中,在缺失的节点上具有空值。
例如:
输入:
1
/ \
2 3
/ \ \
4 5 6
输出:{1,2,3,4,5,0,6}
我曾尝试对数组中的二叉树进行线性遍历,但我想在树的缺失节点位置为null。
std::vector< int > levelorder( tree *root){
queue<tree*> q;
tree* temp;
q.push(root);
while(!q.empty()){
temp=q.front();
q.pop();
arr.push_back(temp->data);
if(temp->left && temp->right)
{
q.push(temp->left);
q.push(temp->right);
}
else if(temp->left && !temp->right)
{
q.push(temp->left);
arr.insert(0);
}
else if(temp->right && !temp->left)
{
q.push(temp->right);
arr.push_back(0);
}
}
return arr;
}
int main()
{
tree *root = newNode(1);
root->left = newNode(2);
root->right = newNode(3);
root->left->left = newNode(4);
root->left->right = newNode(5);
root->right->right = newNode(6);
cout<<"Level Order traversal of binary tree is :"<<endl;
levelorder(root);
for(int i =0; i<arr.size(); i++)
{
cout<< arr[i]<<" ";
}
return 0;
}
我得到输出:{1,2,3,0,4,5,6} 但我希望输出为:{1,2,3,4,5,0,6}
答案 0 :(得分:1)
假定已将空节点正确初始化为nullptr
:
while(!q.empty()){
tree* temp=q.front();
q.pop();
if(!temp)
arr.push_back(0);
else if (temp->left || temp->right)//Only recurse into internal nodes, not leafs
{
arr.push_back(temp->data);
q.push(temp->left);
q.push(temp->right);
}
}
我想指出,这不会打印丢失的子树,而只会打印丢失的叶子。请指定是否应该。
答案 1 :(得分:1)
以下代码支持丢失的子树,并在不存在有意义的节点时立即停止:
std::vector< int > levelorder( tree *root){
int null_in_queue = 0;
std::queue<tree*> q;
std::vector< int > arr;
q.push(root);
while(q.size() != null_in_queue){
tree* temp=q.front();
q.pop();
if(!temp)
{
arr.push_back(0);
q.push(nullptr);
q.push(nullptr);
null_in_queue++; // One was removed, two were added
}
else
{
arr.push_back(temp->data);
q.push(temp->left);
q.push(temp->right);
if (!temp->left) null_in_queue++;
if (!temp->right) null_in_queue++;
}
}
return arr;
}
它将虚拟节点(nullptr)推入队列并计算虚拟节点的数量。当仅剩余虚拟节点时,它将终止。