将二叉树存储在缺少位置为空值的数组中

时间:2019-05-07 14:05:45

标签: c++

我想将二叉树存储在数组中,在缺失的节点上具有空值。

例如:

输入:

      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}

2 个答案:

答案 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)推入队列并计算虚拟节点的数量。当仅剩余虚拟节点时,它将终止。