题目:
【问题描述】
给出一个按照“扩展遍历序列”的扩展先序遍历序列字符串,'.' 代表空的子节点,大写字母代表节点内容。请通过这个字符串建立二叉树,并参考教材算法6.10,对该树进行树状打印输出。
【输入形式】
输入只有1行 (以回车结束),包含一个字符串S,用来建立二叉树。保证S为合法的二叉树扩展先序遍历字符串,节点内容只有大写字母,且S的长度不超过80。
【输出形式】
该树竖向的树状输出。
【样例输入】
AB.D..CE.F...(回车)
【样例输出】注意以下样例输出中(空格)位置, 实际是输出1个空格符.
(空格)(空格)C
(空格)(空格)(空格)(空格)F
(空格)(空格)(空格)E
(空格)A
(空格)(空格)(空格)D
(空格)(空格)B
题解:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
struct TreeNode {
char val;
TreeNode* left;
TreeNode* right;
};
TreeNode* buildTree(const string& s, int& index) {
if (index >= s.length() || s[index] == '.') {
index++;
return NULL;
}
TreeNode* node = new TreeNode;
node->val = s[index];
index++;
node->left = buildTree(s, index);
node->right = buildTree(s, index);
return node;
}
void printTree(TreeNode* root, int level) {
if (!root) return;
printTree(root->right, level + 1);
for (int i = 0; i < level; ++i) {
cout << " ";
}
cout << root->val << endl;
printTree(root->left, level + 1);
}
int main() {
string s;
cin >> s;
int index = 0;
TreeNode* root = buildTree(s, index);
printTree(root, 0);
return 0;
}
碎碎念:早上发现没有找到题解,所以就自己写一份,请不要直接抄袭,好歹改一下变量