在读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. 深度剖析:Redis分布式锁到底安全吗?看完这篇文章彻底懂了!
  2. 独家 | 机器学习中的四种分类任务(附代码)
  3. python有道翻译接口-Python通过调用有道翻译api实现翻译功能示例
  4. 011_Redis的快照持久化
  5. Kubernetes 会不会“杀死” DevOps?
  6. 直接插入排序python实现
  7. 【java读书笔记】ThreadGroup和钩子线程的使用
  8. Tomcat启动失败错误解决Could not publish server configuration for Tomcat v8.0 Server at localhost....
  9. [渝粤教育] 中国地质大学 面向对象程序设计 复习题 (2)
  10. 现在2019年读职高学计算机好吗,读职高有用吗 学什么专业有发展
  11. [测试题]幸运序列(lucky)
  12. sqlserver2000内存突破4g_友商都上16G,华为手机为何一直用8G内存?网友:效仿iOS...
  13. Selenium与Cypress的比较
  14. python计算数组元素个数_python简单获取数组元素个数的方法
  15. 动易html编辑器,动易后台编辑器在IE8下无效的解决方法
  16. 简单的php表单制作
  17. 电脑的wifi天线原理_无线网络 WIFI天线原理 (DIY天线知识学习)上文
  18. 从跨境电商方向选择谈起
  19. 如何搭建KBQA系统 —— 初识KBQA(一)
  20. DNS的定义及工作原理

热门文章

  1. [PMI-ACP认证] PMI-ACP 认证考试内容解析
  2. Android如何来搭建直播平台
  3. 英文歌曲:Burning(燃烧)
  4. Before an Exam
  5. Cocos 未关联脚本编辑器,是否立即在偏好设置内设置外部脚本编辑器
  6. word段落设置首行缩进悬挂缩进
  7. 《电力电子技术》课程教学大纲
  8. html中的ui编辑器,kendoUI系列教程之Editor编辑器
  9. 五万块钱买什么车好_5万左右买什么车好?选这4款没错
  10. hexo博客绑定自己的域名