在读leetcode第337题时,发现题目中的二叉树排列的很规整、漂亮,如下:

示例一:
输入: [3,2,3,null,3,null,1]3/ \2   3\   \ 3   1输出: 7示例二:
输入: [3,4,5,1,3,null,1]3/ \4   5/ \   \ 1   3   1输出: 9

于是参考了博客,并把格式加以修改,最后在Vs 2019 中打印得到了该树形,完整代码详见链接或者文末。需要注意的是第二行的叶子结点不能同时拥有右孩子和左孩子,打印示意图如下:



完整代码如下:

#include <iostream>
#include <iomanip>
#include <cmath>
#include <string>
#include <vector>
using namespace std;struct TreeNode { //树结点定义int val;TreeNode* left;TreeNode* right;TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};class Solution {public:void read(int input[], int& num); //读入输入函数TreeNode* buildTree(int input[], int& num); //生成二叉树函数
};void Solution::read(int input[], int& num)
{string buffer;cin >> buffer; //输入string::iterator ster = buffer.begin();for (; ster < buffer.end(); ++ster) {if (*ster == '[' || *ster == ',')continue;else if (*ster == ']')break;else if (*ster != 'n')input[num] = atoi(&(*ster));else {input[num] = -1; //如果为null,val赋值为-1ster += 4;}++num; //指向下一个}--num; //指向末尾
}TreeNode* Solution::buildTree(int input[], int& num)
{TreeNode* treenode[32]; //存入树节点的指针for (int i = 1; i <= num; ++i) {TreeNode* temp = new TreeNode(input[i]); //生成树节点treenode[i] = temp; //记录指向结点的指针,方便连接树结构if (i != 1) { //不是根节点if (i % 2 == 0) {treenode[i / 2]->left = temp; //该结点为其根节点的左孩子}else {treenode[i / 2]->right = temp; //该结点为其根节点的右孩子}}     }return treenode[1]; //返回根节点
}//树形打印函数
int getHeight(const TreeNode* node) //二叉树的高度
{   int treeHeight = 0;if (node != NULL) {int leftHeight = getHeight(node->left);int rightHeight = getHeight(node->right);treeHeight = leftHeight >= rightHeight ? leftHeight + 1 : rightHeight + 1;}return treeHeight;
}void getLine(const TreeNode* root, int depth, vector<int>& vals)
{int placeholder = -1;if (depth <= 0 && root != NULL) {vals.push_back(root->val);return;}if (root->left != NULL)getLine(root->left, depth - 1, vals);else if (depth - 1 <= 0)vals.push_back(placeholder);if (root->right != NULL)getLine(root->right, depth - 1, vals);else if (depth - 1 <= 0)vals.push_back(placeholder);
}int flag = 0;void printRow(const TreeNode* p, int depth) {vector<int> vec;int placeholder = -1;getLine(p, depth, vec);cout << setw(flag--); // scale setw with depthbool toggle = true; // start with leftif (vec.size() > 1) {for (int v = 0; v < vec.size(); ++v) {if (vec[v] != placeholder) {if (toggle)cout << "/";elsecout << " \\" << setw(2 * (depth - 1));}else {if (toggle)cout << " ";elsecout << "  ";} toggle = !toggle;}cout << endl;  cout << setw(flag--); //输出宽度递减,为输出叶子做准备}toggle = true; // start with leftfor (int v = 0; v < vec.size(); v++) {if (vec[v] != -1) {if (toggle)cout << vec[v] << "   "; //第一个空格占位elsecout << vec[v] << setw(pow(2, flag + 1) - 1);}else {if (v == 0)cout << " "; //第一个空格占位if (toggle)cout << " " << setw(3);  }toggle = !toggle;}cout << endl;
}void postorder(TreeNode* p) {int height = getHeight(p);flag = height + 2; //取齐第一次减减for (int i = 0; i < getHeight(p); i++) {printRow(p, i);height--;}
}int main()
{int num = 1, input[32]; //input 存入结点值 从1开始存入, num 记录结点数Solution solu;solu.read(input, num); //读入数据,并加以处理TreeNode* root = solu.buildTree(input, num); //生成二叉树postorder(root);}

参考:
https://blog.csdn.net/Diano_lx/article/details/85764548

打印树形图(二叉树)相关推荐

  1. java 打印一棵树_java编程题之从上往下打印出二叉树

    本文实例为大家分享了java从上往下打印出二叉树的具体代码,供大家参考,具体内容如下 import java.util.ArrayList; import java.util.Stack; /** * ...

  2. 从上往下打印出二叉树的每个节点,同层节点从左至右打印。

    从上往下打印出二叉树的每个节点,同层节点从左至右打印. 题目:从上往下打印出二叉树的每个节点,同层节点从左至右打印. 分析:借助一个队列,先将根结点的指针入队列,出来时访问它,然后将它的左右孩子带到队 ...

  3. 《剑指Offer》 从上往下打印出二叉树

    题目描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 思路: 其实就是层序遍历,设置一个TreeNode*类型的队列s,用来保存二叉树层序遍历的节点,因为队列是先进先出,所以很好地控制了 ...

  4. 从上往下打印出二叉树的每个节点,同层节点从左至右打印

    // test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  5. 竖向打印二叉树、avl树

    打印二叉树 P1185 绘制二叉树 二叉树的树形打印 打印树形图(二叉树) 二叉树的树形打印 c++二叉树打印(只为美观 从上往下打印二叉树C++ avl 漫话:什么是平衡(AVL)树?这应该是把AV ...

  6. 剑指offer:面试题32 - I. 从上到下打印二叉树

    题目:从上到下打印二叉树 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印. 例如: 给定二叉树: [3,9,20,null,null,15,7], 3/ \9 20/ \15 7 ...

  7. 从上到下打印二叉树1

    从上到下打印二叉树1 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印. 例如: 给定二叉树: [3,9,20,null,null,15,7], 3/ \9 20/ \15 7 返回 ...

  8. 剑指offer23:从上到下打印二叉树

    题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 解题思路 用队列来实现: 从根节点开始,每次打印一个节点都判断该节点是否有子节点,如果有则放在队列末端: 取出队列最前面的节点,重复1 ...

  9. 打印二叉树和为某一值的路径

    要求:输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径.从树的根节点开始往下一直到叶节点所经过的 节点形成一条路径.二叉树的节点定义如下: struct BTNode {int ...

最新文章

  1. SQL数据库隐藏服务器后需要在连接字符串增加端口号,(provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接)]...
  2. 第二届高校大数据比赛之鼠标轨迹识别
  3. java 并发模型总类_java并发编程系列-内存模型基础
  4. c语言延时系统,基于VB的单片机C语言延时程序各参数计算系统
  5. 全平台 Chrome 浏览器 44.0.2403.89 版本下载
  6. 微信小程序API之setInterval
  7. Oracle External Table学习
  8. 理解这篇分布式事务文章,可以做到吊打面试官
  9. 简单枚举(ZJM要抵御宇宙射线)
  10. VIC水文模型入门攻略(下) 汇流和其他相关
  11. [无私分享]最新网盘资源搜索站点
  12. 关于自己开发财务管理系统的个人总结
  13. 织梦DedeCms网站信息统计代码
  14. 2020 年 6 月程序员工资统计,平均 14XXX 元,网友:又跌了!
  15. VNC启动报错问题‘testdb:1 is taken because of’解决
  16. c语言作业 万能公式,按照下面的通项公式计算: sin(x)=x-x3/3!+x5/5!-x7/7!+… 直到最后一项的绝对值小于10-7为止。 用C程序编写正弦...
  17. Linux 部署dogecoin采集结点
  18. 关于Python的三个谎言,别再盲目学Python了
  19. 算法笔记:A2-A4-RSRQ切换算法
  20. 安徽计算机二级vfp成绩,安徽省计算机二级vfp08年6月.doc

热门文章

  1. java @literal_Java Literal類代碼示例
  2. 浙江宁波市中级职称评审业绩要求
  3. iOS开发工作干什么
  4. Turtlebot4入门教程-演示-控制turtlebot4
  5. python实现胶囊网络_在TensorFlow中实现胶囊网络
  6. 利用胶囊网络实现对CIFAR10分类
  7. Mac 电脑浏览器字体显示异常解决方案
  8. html 手机输入法 搜索引擎,解决网页搜索框无法使用手机输入法中的“搜索”按钮的问题...
  9. hdu5304 Eastest Magical Day Seep Group#39;s Summer 状压dp+生成树
  10. 不规则长方体空间移动工程师_拥有滑梯、移动书房和悬浮卧室的132三口之家,好玩到不想出门!...