树的打印方式

来源:互联网 发布:c一维数组排序算法 编辑:程序博客网 时间:2024/06/10 10:19
///////////////////////////////////////////////////////////////////////////////////////////////////////Z行打印二叉树            5           / \          1   8         /\   /\        0  2  7 9            \             4输出格式为 :       5       8 1       0 2 7 9       4void Z_Print_Tree(Tree *root){    if(root == NULL)    {        return ;    }    stack<Tree*> sta[2];   //两个栈   sta[0]是放 奇数层的 数字   sta[1]  放偶数层的数字    sta[0].push(root);    int ceng = 1;//当前打印的层数    while(!sta[0].empty() || !sta[1].empty())    {        Tree *temp = NULL;        if(ceng % 2 != 0)        //奇数层        {            temp = sta[0].top();    //弹出一个元素            sta[0].pop();            cout<<temp->nValue<<" ";            if(temp->pLeft != NULL)            {                sta[1].push(temp->pLeft);   //下一层  为 偶数层  要放到  第二个栈  中            }            if(temp->pRight != NULL)            {                sta[1].push(temp->pRight);    //下一层  为 偶数层  要放到  第二个栈  中            }         }        else        {            temp = sta[1].top();            sta[1].pop();            cout<<temp->nValue<<" ";            if(temp->pRight != NULL)            {                sta[0].push(temp->pRight);            }            if(temp->pLeft != NULL)            {                sta[0].push(temp->pLeft);            }        }        if(ceng % 2 != 0)     //只有  当前的  层数  打印完  层数  ceng  才会 ++        {            if(sta[0].empty())   //奇数层  看  sta[0]  栈  是否  打印完   ,栈 为 空 才会  ceng++            {                cout<<endl;                ceng++;            }        }        if(ceng % 2 == 0)        {            if(sta[1].empty())            {                cout<<endl;                ceng++;            }        }    }}/////////////////////////////////////////////////////////////////////////////////////////////////////把二叉树打印成多行            5           / \          1   8         /\   /\        0  2  7 9            \             4输出格式为 :       5       1 8       0 2 7 9       4void Ceng_Print(Tree *root){    int Next_Node_Sum = 0;//下一层结点的个数    int To_Be_Print_Sum = 1;//当前层需要打印结点的个数    queue<Tree*> que;    que.push(root);    while(!que.empty())    {        Tree *temp = que.front();        que.pop();        cout<<temp->nValue<<" ";        To_Be_Print_Sum--;        if(temp->pLeft != NULL)        {            que.push(temp->pLeft);            Next_Node_Sum++;        }        if(temp->pRight != NULL)        {            que.push(temp->pRight);            Next_Node_Sum++;        }        if(To_Be_Print_Sum == 0)        {            cout<<endl;            To_Be_Print_Sum = Next_Node_Sum;            Next_Node_Sum = 0;        }    }}/////////////////////////////////////////////////////////////////////////////////////////////////////打印树的第k层结点//打印第k层结点顺序的打印            5           / \          1   8         /\   /\        0  2  7 9            \             4输出格式为 :       第0层 5       第2层 0 2 7 9void PrintKCeng(Tree *root,int k){    if(root == NULL)    {        return;    }    if(k == 0)    {        cout<<root->nValue<<" ";        return;    }    if(root->pLeft != NULL)    {        PrintKCeng(root->pLeft,k-1);    }    if(root->pRight != NULL)    {        PrintKCeng(root->pRight,k-1);    }}/////////////////////////////////////////////////////////////////////////////////////////////////////            5           / \          1   8         /\   /\        0  2  7 9            \             4输出格式为 :       4       9 7 2 0       8 1       5void ReversePrintCeng(Tree *root,stack<vector<int> > &sta/*因为当前需要从树的叶子节点输出,所以用栈*/){    if(root == NULL)    {        return ;    }    vector<int>vec;    //储层当前层数的节点    queue<Tree*> que;   //通过层遍历 树的 队列    que.push(root);    int To_Be_Print = 1;  //当前层需要打印 的 个数    int Next_Ceng_Sum = 0;  //下一层 需要 打印 的 个数    while(!que.empty()) // 栈不为空    {        Tree *temp = que.front();        que.pop();        vec.push_back(temp->nValue);        To_Be_Print--;       // 需要打印的 个数 --        if(temp->pRight != NULL)  //因为 当前  需要  从 每一层 的 右边 开始 存入节点         {            que.push(temp->pRight);   // 所以 需要  先判断 右边  是否 有节点              Next_Ceng_Sum++;          // 下一层数  的 结点 个数 ++        }        if(temp->pLeft != NULL)        {            que.push(temp->pLeft);            Next_Ceng_Sum++;        }        if(To_Be_Print == 0)        //如果 当前层数 需要打印的 结点  个数 没有 了 0 个         {            sta.push(vec);            // 将当前  层数 的节点   放到  栈中             To_Be_Print = Next_Ceng_Sum;       //更改  需要打印结点的 个数             Next_Ceng_Sum = 0;     //重新 置 0            vec.clear();     //vector  清空        }    }}


1 0
原创粉丝点击