控制台打印二叉树

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<string>
#include<iomanip>
#include<cmath>
#include<queue>
#define N 100
#define MAXN 0x3f3f3f3f
using namespace std;

struct TreeNode{
    TreeNode* child[2];
    int val;
    int d;//距离屏幕左端的宽度
    TreeNode(){
        child[0] = child[1] = NULL;
    }
};
int width;
int step = 4;
void buildT(TreeNode* &t){
       int val;
       cin>>val;
       if(val == -1){
           t = NULL;
           return;
       }
       t = new TreeNode();
       t->val = val;
    buildT(t->child[0]);
    buildT(t->child[1]);
}

void widthT(TreeNode* t){
    if(!t) return;
    widthT(t->child[0]);
    t->d = width;
    width+=step;
    widthT(t->child[1]);
}
void outT(TreeNode* t){
     width=0;
     widthT(t);
     queue<TreeNode*> q;
     vector<TreeNode*> v;
     q.push(t);
     int n=1;//当前层的节点个数
     int nn=0;//统计下一次的节点的个数
     int pred;//前一个节点距离左屏幕的距离
     while(!q.empty()){
         TreeNode* tt = q.front();
         q.pop();
         v.push_back(tt);
         //放入孩子节点
         if(tt->child[0]) q.push(tt->child[0]), ++nn;
         if(tt->child[1]) q.push(tt->child[1]), ++nn;
         if(v.size()==n){//上一层访问完毕
             n = nn;
             nn = 0;
             /***************************************/
                 //打印节点的数值
             int pred = -1;//前面的节点距离屏幕左端的距离
             for(int i=0; i<v.size(); ++i) {
                  TreeNode* x= v[i];
                  if(pred==-1){
                       cout<<setw(x->d)<<"";
                       cout<<x->val;
                       pred = x->d;
                  } else {
                      cout<<setw(x->d-pred)<<x->val;
                      pred = x->d;
                  }
             }
             cout<<endl;
             /***************************************/

             /***************************************/
             //打印"---------------"
             pred = -1;
             for(int i=0; i<v.size(); ++i){
                 TreeNode* x= v[i];
                 int ld=-1, rd=-1;//左右子树距离屏幕左端的距离
                if(x->child[0]) ld = x->child[0]->d;
                if(x->child[1]) rd = x->child[1]->d;
                if(ld != -1) {
                     if(pred==-1){//打印左孩子的分枝图案
                           cout<<setw(ld)<<"";
                      } else {
                          cout<<setw(ld-pred-1)<<"";
                      }
                      for(int j=0; j<x->d-ld; ++j)
                          cout<<"-";
                      cout<<"-";
                } else {
                    if(pred==-1){
                         cout<<setw(x->d)<<"";
                     } else {
                         cout<<setw(x->d-pred-1)<<"";
                     }
                     cout<<"-";
                }
                pred = x->d;
                if(rd != -1){//打印右孩子的分枝图案
                    for(int j=0; j<rd-x->d; ++j)
                          cout<<"-";
                     pred = rd;
                }
             }
             cout<<endl;
             /***************************************/

             /***************************************/
             //打印 "|"
             pred = -1;
             for(int i=0; i<v.size(); ++i){//打印竖线,过程和上面一部分差不多,稍作修改就好
                 TreeNode* x= v[i];
                 int ld=-1, rd=-1;//左右子树距离屏幕左端的距离
                if(x->child[0]) ld = x->child[0]->d;
                if(x->child[1]) rd = x->child[1]->d;
                if(ld != -1) {
                     if(pred==-1){
                           cout<<setw(ld)<<"";
                      } else {
                          cout<<setw(ld-pred-1)<<"";
                      }
                      cout<<"|";
                      for(int j=0; j<x->d-ld; ++j)
                          cout<<" ";
                } else {
                    if(pred==-1){
                         cout<<setw(x->d)<<"";
                     } else {
                         cout<<setw(x->d-pred-1)<<"";
                     }
                     cout<<" ";
                }
                pred = x->d;
                if(rd != -1){
                    for(int j=0; j<rd-x->d-1; ++j)
                          cout<<" ";
                     cout<<"|";
                     pred = rd;
                }
             }
             cout<<endl;
             /***************************************/
             v.clear();//清空上一层数据
         }
     }
}

int main(){
    TreeNode *T = NULL;
    buildT(T);
    outT(T);
    return 0;
}

/*
2 7 -1 -1 4 8 -1 -1 -1 3 6 -1 -1 5 -1 -1
2 4 -1 -1 5 -1 -1 3 6 8 10 14 16 -1 -1 17 -1 -1 15 -1 -1 11 -1 -1 9 12 -1 -1 13 -1 -1 7 -1 -1
*/

时间: 2024-10-29 08:04:03

控制台打印二叉树的相关文章

Mybatis控制台打印Sql语句的实现代码_java

MyBatis简介 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录. 下面看下Mybatis控制台打印Sql语句 1.首先将ibatis log4j运行级别调到DEBUG可以在控制台打印出ibatis运行的sql语

jaxbcontext-java用注解实现将xml中的值获取到并在控制台打印为什么出错

问题描述 java用注解实现将xml中的值获取到并在控制台打印为什么出错 <?xml version=""1.0"" encoding=""ISO-8859-1"" ?> Harry PotterJ K. Rowling200529.99 Everyday ItalianGiada De Laurentiis200530.00 Learning XMLErik T. Ray200339.95 XQuery Kick

剑指offer系列之五十四:按之字形顺序打印二叉树

题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 此题明显是层序遍历的思路.由于需要按照之字形打印每一层,相当于在打印每一行之前需要判断上一行打印的顺序.比如,如果上一行打印的顺序使从左到右,那么下一行的打印顺序应该是从右到左.实现的这点可以采用奇数行从左到右打印,偶数行从右到左进行打印.还可直接设置 一个布尔变量,每打印一行就改变一次该变量的值.其他的就是层序遍历的思路了.下面是我实现的代

服务器-slf4j 只能在控制台打印日志,没法写入文件,也没报错,也看不出哪里冲突。就是写不进文件。

问题描述 slf4j 只能在控制台打印日志,没法写入文件,也没报错,也看不出哪里冲突.就是写不进文件. 整个项目都做完了,就是单独写日志卡在这了,虽说不是太重要,但是弄不明白还是不甘心.配置文件路径没问题,tomcat启动也没报错.而且本机是可以写日志的,linux服务器上就不行,路径看了没问题.<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM

java语言-用户接受一个奇数,通过如下方式图片展示的方式,在控制台打印出来,求大神讲解和源码

问题描述 用户接受一个奇数,通过如下方式图片展示的方式,在控制台打印出来,求大神讲解和源码 1数字旋转 输入奇数n旋转1-n的平方 21 22 23 24 25 20 7 8 9 10 19 6 1 2 11 18 5 4 3 12 17 16 15 14 13

mybatis3.0+spring3.1下,控制台打印sql问题。。大侠进。。

问题描述 刚开始用的是ibatis2.3.控制台打印sql毫无压力换了mybatis3.0后,控制台是空空如也,啥也没网上也找了各种说法,都不行,也不知道都是忽悠人的还是配置没对没办法,只能来csdn请教了,有哪位仁兄是用mybatis3.0+spring3.1架构,后台sql打印完好的请指点一二呗...不胜感激了...成功的分都给你拉...阿门 解决方案 解决方案二:没人么..解决方案三:真的没人知道吗..解决方案四:log4j.logger.com.ibatis=DEBUG解决方案五:<!-

JAVAEE 问题:Filter 的用户登录问题,无法在控制台打印相关信息

问题描述 这是Filter的实现类代码packagelee;importjavax.servlet.*;importjavax.servlet.http.*;importjavax.servlet.annotation.*;importjava.io.*;publicclassAuthorityFilterimplementsFilter{//FilterConfig可用于访问Filter的配置信息privateFilterConfigconfig;//实现初始化方法publicvoidinit

《剑指offer》-逐层打印二叉树

题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 乍一看就是一个BFS,但是因为太久没刷题都忘记了要使用queue来作为空间存储容器了. 先参考milolip的代码,写出这样的solution: class Solution { public: vector<vector<int> > Print(TreeNode* pRoot) { vector<vector<int> > res; if(pRoot==NULL){ return

[LeetCode] Print Binary Tree 打印二叉树

Print a binary tree in an m*n 2D string array following these rules: The row number m should be equal to the height of the given binary tree. The column number n should always be an odd number. The root node's value (in string format) should be put i