算法题:模拟LeetCode上树的输入
数组变树
// 例:二叉树 [1,2,2,3,3,null,null,4,4]
// vector<string> nodes = { "1","2","2","3","3","null","null","4","4" };
// 1
// / \
// 2 2
// / \
// 3 3
// / \
// 4 4
#include <vector>
#include <string>
#include <queue>
using namespace std;
//二叉树结点结构
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode() :val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) :val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode* left, TreeNode* right) :val(x), left(left), right(right) {}
};
TreeNode* createBinaryTree(vector<string> nodes) {
int len = nodes.size();
if (len == 0) {
return NULL;
}
//LeetCode例题里面往往省略最后一个null
if (len % 2 == 0) {
nodes.push_back("null");
}
if (nodes[0] == "null") {
return nullptr;
}
TreeNode* root;
//建立结点队列并将根节点入队
queue<TreeNode*> nodesQue;
root = new TreeNode(stoi(nodes[0]));
nodesQue.push(root);
//loc遍历数组,每次取两个结点
for (int loc = 1; loc < len; loc = loc + 2) {
//获取结点并出队
TreeNode* node = nodesQue.front();
nodesQue.pop();
//获取队头结点的左右结点
string left = nodes[loc];
string right = nodes[loc + 1];
//赋予左右结点
if (left == "null") {
node->left = nullptr;
}
else {
node->left = new TreeNode(stoi(left));
nodesQue.push(node->left);
}
if (right == "null") {
node->right = nullptr;
}
else {
node->right = new TreeNode(stoi(right));
nodesQue.push(node->right);
}
}
return root;
}
树变数组,类似层次遍历
vector<string> LcBinTree2Str(TreeNode* root) {
vector<string> treeStr;
queue<TreeNode*> nodesQue;
nodesQue.push(root);
while (!nodesQue.empty()) {
TreeNode* node = nodesQue.front();
nodesQue.pop();
if (node) {
treeStr.push_back(to_string(node->val));
nodesQue.push(node->left ? node->left : NULL);
nodesQue.push(node->right ? node->right : NULL);
}
else {
treeStr.push_back("null");
}
}
//省略掉所有末尾的null
for (int i = treeStr.size() - 1; i >= 0; i--) {
if (treeStr[i] == "null") {
treeStr.pop_back();
}
else {
break;
}
}
return treeStr;
}