残局

不过在等杀死希望的最后一刀

0%

力扣二叉树

本文主要是介绍力扣二叉树的构造

即,从[x, x, x, x, x]为层序遍历的结果来构造一颗二叉树

数据结构定义

树节点数据结构包括 — 值、左指针、右指针。

1
2
3
4
5
6
7
8
9
// 数据结构定义
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr){}
TreeNode(int val) : val(val), left(nullptr), right(nullptr){}
TreeNode(int val, TreeNode *left, TreeNode *right) : val(val), left(left), right(right){};
};

力扣输入形式构造数组

根据[x, x, x, x, x]的形式创建数组

1
2
3
4
5
6
7
8
9
10
11
12
string str;
getline(cin, str);
vector<int> vec;
int val = 0;
for(auto &ch:str) {
if(ch >= '0' && ch <= '9') {
val = val * 10 + ch - '0';
} else if(ch == ',' || ch == ']') {
vec.push_back(val);
val = 0;
}
}

用层序遍历结果建树

根据树用数组表示的特点(根节点角标与左右子树角标的关系)来递归构造二叉树

1
2
3
4
5
6
7
8
9
10
// 建树
TreeNode *CreateTree(vector<int> &nums, int index) {
if (index >= nums.size() || nums[index] == 0) {
return nullptr;
}
TreeNode *node = new TreeNode(nums[index]);
node->left = CreateTree(nums, 2 * index + 1);
node->right = CreateTree(nums, 2 * index + 2);
return node;
}

层序遍历

层序遍历,验证与输入是否一致

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 层序遍历
vector<int> printTree(TreeNode * root) {
vector<int> temp;
queue<TreeNode *> que;
que.push(root);
while(!que.empty()) {
TreeNode *node = que.front();
que.pop();
temp.push_back(node->val);
if(node->left) {
que.push(node->left);
}
if(node->right) {
que.push(node->right);
}
}
return temp;
}

释放内存

1
2
3
4
5
6
7
8
9
// 释放
void DeleteTree(TreeNode * root) {
if(root == nullptr) {
return;
}
DeleteTree(root->left);
DeleteTree(root->right);
delete root;
}

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include<bits/stdc++.h>
using namespace std;
// 数据结构定义
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr){}
TreeNode(int val) : val(val), left(nullptr), right(nullptr){}
TreeNode(int val, TreeNode *left, TreeNode *right) : val(val), left(left), right(right){};
};
// 建树
TreeNode *CreateTree(vector<int> &nums, int index) {
if (index >= nums.size() || nums[index] == 0) {
return nullptr;
}
TreeNode *node = new TreeNode(nums[index]);
node->left = CreateTree(nums, 2 * index + 1);
node->right = CreateTree(nums, 2 * index + 2);
return node;
}
// 释放
void DeleteTree(TreeNode * root) {
if(root == nullptr) {
return;
}
DeleteTree(root->left);
DeleteTree(root->right);
delete root;
}
// 层序遍历
vector<int> printTree(TreeNode * root) {
vector<int> temp;
queue<TreeNode *> que;
que.push(root);
while(!que.empty()) {
TreeNode *node = que.front();
que.pop();
temp.push_back(node->val);
if(node->left) {
que.push(node->left);
}
if(node->right) {
que.push(node->right);
}
}
return temp;
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
string str;
getline(cin, str);
vector<int> vec;
int val = 0;
for(auto &ch:str) {
if(ch >= '0' && ch <= '9') {
val = val * 10 + ch - '0';
} else if(ch == ',' || ch == ']') {
vec.push_back(val);
val = 0;
}
}
TreeNode *root = CreateTree(vec, 0);
vector<int> res;
res = printTree(root);
cout << "[";
for (int i = 0; i < res.size(); ++i) {
cout << res[i];
if(i != res.size() - 1) {
cout << ",";
}
}
cout << "]";
DeleteTree(root);
return 0;
}
-------------感谢阅读有缘再见-------------