树的打印方式
2016-01-24 17:38
274 查看
/////////////////////////////////////////////////////////////////////////////////////////////////////// Z行打印二叉树 5 / \ 1 8 /\ /\ 0 2 7 9 \ 4 输出格式为 : 5 8 1 0 2 7 9 4 void 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 4 void 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 9 void 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 5 void 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 清空 } } }
相关文章推荐
- 【转】Hadoop生态上几个技术的关系与区别:hive、pig、hbase 关系与区别
- hdu 1159(DP+字符串最长公共序列)
- iOS9 中不支持http
- Ceph安装
- HDOJ 2041 超级楼梯
- Hive简介
- JavaEE Tutorials (29) - Duke辅导案例研究示例
- tornado的简单使用
- 数据结构实现之索引优先队列用例(多路归并)
- uva 101 - The Blocks Problem
- JavaEE Tutorials (28) - Duke书店案例研究示例
- 监听短信数据库,获取验证码
- iTerm2 快捷键
- 如风一样,飞翔------Day37
- JavaEE Tutorials (27) - Java EE的并发工具
- 我对递归的认识
- ssh爆破攻击,denyhosts.service服务,hosts.deny拒绝ssh登录文档
- bzoj2002
- HDU 1047 多个大数相加 Integer Inquiry
- Spark机器学习读书笔记-CH03