C++ 中打印二叉树
假设我们要在一个 m*n 的二维字符串数组中显示一个二叉树,遵循以下规则:
- 行数 m 应该与给定二叉树的高度相同。
- 列数 n 应该始终为奇数。
- 根节点的值应该放在第一行的正中间。根节点所在的列和行将剩余空间分成两个部分:左下部分和右下部分。我们应该在左下部分打印左子树,在右下部分打印右子树。这里左下部分和右下部分应该大小相同。即使一个子树为空而另一个不为空,我们也不需要为那个空的子树打印任何内容,但仍然需要保留与另一个子树一样大的空间。现在,如果两个子树都为空,那么我们不需要为它们都保留空间。
- 每个未使用的空间都应该包含一个空字符串。
- 按照相同的规则显示子树。
所以如果输入树是这样的:
那么输出将是:
1 | ||||||
2 | 3 | |||||
4 |
为了解决这个问题,我们将遵循以下步骤:
- 定义另一个名为 fill() 的方法,它将接收节点、矩阵 ret、层级 lvl 以及 l 和 r 值。
- 如果节点为空,则返回。
- ret[lvl, (l + r)/2] := 节点值作为字符串。
- fill(节点的左子节点, ret, lvl+1, l, (l+r)/2)
- fill(节点的右子节点, ret, lvl+1, (l+r+1)/2, r)
- 在主方法中执行以下操作:
- h := 树的高度。
- 叶子数 = 2^h – 1。
- 创建一个 h x 叶子数 的矩阵,并用空字符串填充它。
- fill(根节点, ret, 0, 0, 叶子数)
- 返回 ret。
让我们看看下面的实现来更好地理解:
示例
#include <bits/stdc++.h> using namespace std; void print_vector(vector<vector<auto> > v){ cout << "["; for(int i = 0; i<v.size(); i++){ cout << "["; for(int j = 0; j <v[i].size(); j++){ cout << v[i][j] << ", "; } cout << "],"; } cout << "]"<<endl; } class TreeNode{ public: int val; TreeNode *left, *right; TreeNode(int data){ val = data; left = right = NULL; } }; void insert(TreeNode **root, int val){ queue<TreeNode*> q; q.push(*root); while(q.size()){ TreeNode *temp = q.front(); q.pop(); if(!temp->left){ if(val != NULL) temp->left = new TreeNode(val); else temp->left = new TreeNode(0); return; } else { q.push(temp->left); } if(!temp->right){ if(val != NULL) temp->right = new TreeNode(val); else temp->right = new TreeNode(0); return; } else { q.push(temp->right); } } } TreeNode *make_tree(vector<int> v){ TreeNode *root = new TreeNode(v[0]); for(int i = 1; i<v.size(); i++){ insert(&root, v[i]); } return root; } class Solution { public: int getHeight(TreeNode* node){ if(!node)return 0; return 1 + max(getHeight(node->left), getHeight(node->right)); } void fill(TreeNode* node, vector<vector<string>>& ret, int lvl, int l, int r){ if(!node || node->val == 0)return; ret[lvl][(l + r) / 2] = to_string(node->val); fill(node->left, ret, lvl + 1, l, (l + r) / 2); fill(node->right, ret, lvl + 1, (l + r + 1) / 2, r); } vector<vector<string>> printTree(TreeNode* root) { int h = getHeight(root); int leaves = (1 << h) - 1; vector < vector <string> > ret(h, vector <string>(leaves, "")); fill(root, ret, 0, 0, leaves); return ret; } }; main(){ vector<int> v = {1,2,3,NULL,4}; Solution ob; TreeNode *root = make_tree(v); print_vector(ob.printTree(root)); }
输入
[1,2,3,null,4]
输出
[[, , , 1, , , , ], [, 2, , , , 3, , ], [, , 4, , , , , ],]
广告