This commit is contained in:
2025-09-15 21:12:04 +08:00
commit 3f58f483ff
144 changed files with 5298 additions and 0 deletions

29
else/DivConvert.h Normal file
View File

@@ -0,0 +1,29 @@
//
// Created by 李洋 on 2023/10/2.
//
#ifndef LEECODE_C_DIVCONVERT_H
#define LEECODE_C_DIVCONVERT_H
#include <stack>
#include <string>
using namespace std;
string decimalToBinaryUsingEuclidean(int target) {
stack<int> s;
string result = "";
while (target) {
s.push(target % 2);
target /= 2;
}
while (!s.empty()) {
result.append(to_string(s.top()));
s.pop();
}
return result;
}
// test : cout << decimalToBinaryUsingEuclidean(555) << endl;
#endif //LEECODE_C_DIVCONVERT_H

0
else/Heap/README.md Normal file
View File

34
else/Heap/test.h Normal file
View File

@@ -0,0 +1,34 @@
//
// Created by 李洋 on 2023/10/18.
//
#ifndef LEECODE_C_TEST_H_P
#define LEECODE_C_TEST_H_P
#include <queue>
#include <iostream>
using namespace std;
void testPQ() {
priority_queue<int, deque<int>, less<>> maxHeap;
maxHeap.push(1);
maxHeap.push(10);
maxHeap.push(3);
maxHeap.push(3);
maxHeap.push(3);
cout << maxHeap.top() << endl;
maxHeap.pop();
maxHeap.push(4);
cout << maxHeap.top() << endl;
maxHeap.pop();
maxHeap.push(2);
cout << maxHeap.top() << endl;
priority_queue<int, vector<int>, greater<>> minHeap;
minHeap.push(20);
minHeap.push(10);
minHeap.push(30);
cout << minHeap.top() << endl;
}
#endif //LEECODE_C_TEST_H_P

23
else/README.md Normal file
View File

@@ -0,0 +1,23 @@
# ELSE
-
- [X] [用栈实现辗转相除法](./DivConvert.h) - P59
-
- [X] [对称序列](./symmetry.h)
-
- [X] [括号匹配](./kuohao.h) - P63
-
- [ ] 二叉树计算
-
- [X] [二叉树代码 递归 + 非递归前中后序遍历](./traverse.h)
-
- [X] [快速排序](./sorts.h)
- [ ] [堆排序](./sorts.h)
-
- [X] [](./structs/Graph.h)
- [X] [深度优先遍历](./structs/Graph.h)

31
else/demo/1.h Normal file
View File

@@ -0,0 +1,31 @@
//
// Created by 李洋 on 2024/1/8.
//
#ifndef LEECODE_C_1_H
#define LEECODE_C_1_H
#include <iostream>
#include <vector>
#include <stdlib.h>
using namespace std;
void test1() {
//方式一
int a;
cout << "输入长度:";
cin >> a;
int *p = (int *) malloc(a * sizeof(int)); //c写法在运行中分配空间创建指定长度数组
p[a - 1] = 1;
cout << p[a-1] << endl;
//方式2 推荐
vector<int> b; //c++ 向量,可以看作是动态数组,自动扩充容量
vector<vector<int>> c; //二维动态数组
b.push_back(1);
b.push_back(2);
b.size(); //获取当前长度
}
#endif //LEECODE_C_1_H

24
else/demo/2.h Normal file
View File

@@ -0,0 +1,24 @@
//
// Created by 李洋 on 2024/1/11.
//
#ifndef LEECODE_C_2_H
#define LEECODE_C_2_H
#include <iostream>
using namespace std;
void test1(int *p, int index) {
cout << p[index];
}
void run() {
int arr[3];
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
test1(arr, 2);
}
#endif //LEECODE_C_2_H

52
else/kuohao.h Normal file
View File

@@ -0,0 +1,52 @@
//
// Created by 李洋 on 2023/10/4.
//
#ifndef LEECODE_C_KUOHAO_H
#define LEECODE_C_KUOHAO_H
#include <string>
#include <stack>
bool isKuoHao(std::string target) {
std::stack<char> tk;
for (int i = 0; i < target.length(); ++i) {
if (tk.empty()) {
tk.push(target[i]);
continue;
}
char temp;
switch (target[i]) {
case '{':
temp = '}';
break;
case '}':
temp = '{';
break;
case '[':
temp = ']';
break;
case ']':
temp = '[';
break;
case '(':
temp = ')';
break;
case ')':
temp = '(';
break;
default:
temp = 'x';
}
if (temp == tk.top()) {
tk.pop();
} else {
tk.push(target[i]);
}
}
return tk.empty();
}
// cout << isKuoHao("{}(({}))") << endl;
#endif //LEECODE_C_KUOHAO_H

31
else/main.h Normal file
View File

@@ -0,0 +1,31 @@
//
// Created by 李洋 on 2023/10/12.
//
#ifndef LEECODE_C_MAIN_H
#define LEECODE_C_MAIN_H
#include <iostream>
#include <queue>
#include "./structs/Tree.h"
#include "./traverse.h"
#include "./Heap/test.h"
#include "./sorts.h"
#include "./structs/Graph.h"
#include "./topic/2019.h"
#include <iostream>
using namespace std;
void run()
{
vector<int> arr({3, 2, 2, 4, 6, 2, 3});
odd_even(arr);
for (int i : arr)
{
cout << i << " ";
}
cout << endl;
}
#endif // LEECODE_C_MAIN_H

171
else/sorts.h Normal file
View File

@@ -0,0 +1,171 @@
//
// Created by 李洋 on 2023/10/19.
//
#ifndef LEECODE_C_SHELLSORT_H
#define LEECODE_C_SHELLSORT_H
#include <vector>
#include <random>
#include <iostream>
using namespace std;
void shellSort(vector<int> &arr) {
int n = arr.size();
// 选择增量序列,可以根据需要选择不同的序列
for (int gap = n / 2; gap > 0; gap /= 2) {
// 使用插入排序对每个子数组进行排序
for (int i = gap; i < n; ++i) {
int temp = arr[i];
int j = i;
while (j >= gap && arr[j - gap] > temp) {
arr[j] = arr[j - gap];
j -= gap;
}
arr[j] = temp;
}
}
}
// 快速排序 - start
int partition(vector<int> &arr,int left,int right){
int sign = arr[left];
while(left < right){
while(left < right && sign <= arr[right]){
right--;
}
swap(arr[left],arr[right]);
while(left < right && arr[left] <= sign){
left++;
}
swap(arr[left],arr[right]);
}
return left;
}
void splits(vector<int> &arr,int left,int right){
if (left < right)
{
int norm = partition(arr,left,right);
splits(arr,left,norm - 1);
splits(arr,norm + 1,right);
}
}
void quickSort(vector<int> &arr) {
splits(arr, 0, arr.size() - 1);
}
// 快速排序 - end
// 堆排序 - start small -> large
void maxHeapify(vector<int> &arr, int n, int i) {
int largest = i;
int left = i * 2 + 1;
int right = i * 2 + 2;
if (left < n && arr[left] > arr[largest]) {
largest = left;
}
if (right < n && arr[right] > arr[largest]) {
largest = right;
}
if (largest != i) {
swap(arr[i], arr[largest]);
maxHeapify(arr, n, largest);
}
}
void heapSort(vector<int> &arr) {
auto n = arr.size();
for (int i = n / 2 - 1; i >= 0; --i) {
maxHeapify(arr, n, i);
}
for (int i = n - 1; i > 0; i--) {
swap(arr[0], arr[i]);
maxHeapify(arr, i, 0);
}
}
// 堆排序 - end small -> large
// 归并排序
void merge(std::vector<int>& arr, int left, int middle, int right) {
int n1 = middle - left + 1;
int n2 = right - middle;
std::vector<int> leftArr(n1);
std::vector<int> rightArr(n2);
for (int i = 0; i < n1; i++) {
leftArr[i] = arr[left + i];
}
for (int i = 0; i < n2; i++) {
rightArr[i] = arr[middle + 1 + i];
}
int i = 0, j = 0, k = left;
while (i < n1 && j < n2) {
if (leftArr[i] <= rightArr[j]) {
arr[k] = leftArr[i];
i++;
} else {
arr[k] = rightArr[j];
j++;
}
k++;
}
while (i < n1) {
arr[k] = leftArr[i];
i++;
k++;
}
while (j < n2) {
arr[k] = rightArr[j];
j++;
k++;
}
}
void mergeSort(std::vector<int>& arr, int left, int right) {
if (left < right) {
int middle = left + (right - left) / 2;
mergeSort(arr, left, middle);
mergeSort(arr, middle + 1, right);
merge(arr, left, middle, right);
}
}
void runS() {
// std::random_device rd;
// std::mt19937 gen(rd());
// std::uniform_int_distribution<int> dis(1, 100);
vector<int> nums;
nums.reserve(10);
// for (int i = 0; i < 10; ++i) {
// nums.push_back(dis(gen));
// }
nums.push_back(11);
nums.push_back(6);
nums.push_back(9);
nums.push_back(23);
nums.push_back(6);
nums.push_back(11);
nums.push_back(26);
nums.push_back(40);
nums.push_back(8);
nums.push_back(95);
for (int i: nums) {
cout << i << " ";
}
cout << endl;
shellSort(nums);
for (int i: nums) {
cout << i << " ";
}
}
#endif //LEECODE_C_SHELLSORT_H

181
else/structs/Graph.h Normal file
View File

@@ -0,0 +1,181 @@
//
// Created by 李洋 on 2023/10/21.
// 以邻接矩阵实现的INT图及其具体操作
//
#ifndef LEECODE_C_GRAPH_H
#define LEECODE_C_GRAPH_H
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <random>
#include <iostream>
#include <stack>
using namespace std;
class Graph {
public:
int size;
Graph(int n, bool direction) {
this->size = n;
G = vector<vector<int>>(size, vector<int>(size, 0));
visited = vector<int>(size, 0);
random_device rd;
mt19937 gen(rd());
uniform_int_distribution<int> dis(0, 1);
if (!direction) {
for (int i = 0; i < size; ++i) {
for (int j = i + 1; j < size; ++j) {
if (dis(gen)) {
G[i][j] = 1;
G[j][i] = 1;
}
}
}
} else {
for (int i = 0; i < size; ++i) {
for (int j = 0; j < size; ++j) {
if (i == j) {
continue;
}
if (dis(gen)) {
G[i][j] = 1;
}
}
}
}
}
// 0 1 0 0 0 0
// 1 0 1 1 0 0
// 0 1 0 0 0 1
// 0 1 0 0 0 0
// 0 0 0 0 0 1
// 0 0 1 0 1 0
Graph(int x) {
size = 6;
G = vector<vector<int>>(size, vector<int>(size, 0));
visited = vector<int>(size, 0);
vector<vector<int>> Edges;
if (x == 1) {
Edges.push_back({0, 1});
Edges.push_back({1, 2});
Edges.push_back({1, 3});
Edges.push_back({2, 5});
Edges.push_back({4, 5});
}
if (x == 2) {
}
for (auto Edge: Edges) {
G[Edge[0]][Edge[1]] = 1;
G[Edge[1]][Edge[0]] = 1;
}
}
Graph *GraphByEdge(vector<vector<int>> &Edges) {
for (auto Edge: Edges) {
vertex.insert(Edge[1]);
vertex.insert(Edge[2]);
}
size = vertex.size();
G = vector<vector<int>>(size, vector<int>(size, 0));
for (auto Edge: Edges) {
G[Edge[1]][Edge[2]] = 1;
}
return this;
}
void printG() {
for (int i = 0; i < size; ++i) {
for (int j = 0; j < size; ++j) {
cout << G[i][j] << " ";
}
cout << endl;
}
}
queue<int> DFS(int start) {
queue<int> Q;
stack<pair<int, int>> S;
Q.push(start);
S.emplace(start, -1);
visited[0] = 1;
while (!S.empty()) {
auto temp = S.top();
auto next = NextPoint(temp.first, temp.second);
S.top().second = next;
if (next == -1) {
S.pop();
continue;
}
if (visited[next]) {
continue;
}
Q.push(next);
visited[next] = 1;
S.emplace(next, -1);
}
if (Q.size() != size) {
// 将其他的点再进行DSF
}
return Q;
}
queue<int> BFS(int start) {
queue<int> Q;
queue<pair<int, int>> S;
Q.push(start);
S.emplace(start, -1);
visited[0] = 1;
while (!S.empty()) {
auto temp = S.front();
auto next = NextPoint(temp.first, temp.second);
S.front().second = next;
if (next == -1) {
S.pop();
continue;
}
if (visited[next]) {
continue;
}
Q.push(next);
visited[next] = 1;
S.emplace(next, -1);
}
if (Q.size() != size) {
// 将其他的点再进行BSF
}
return Q;
}
int NextPoint(int vex, int now) {
auto row = G[vex];
for (int i = now + 1; i < size; ++i) {
if (row[i] != 0) {
return i;
}
}
return -1;
}
private:
vector<vector<int>> G; // adjacent matrix
vector<int> visited;
set<int> vertex; // The collection of vertex
set<set<int>> ccp; // The graph has multiple connected components.
};
#endif //LEECODE_C_GRAPH_H

8
else/structs/List.h Normal file
View File

@@ -0,0 +1,8 @@
#ifndef List_h
#define List_h
struct ListNode{
int value;
struct ListNode * next;
}
#endif //List_h

94
else/structs/Tree.h Normal file
View File

@@ -0,0 +1,94 @@
//
// Created by 李洋 on 2023/8/14.
//
#ifndef LEECODE_C_TREE_H
#define LEECODE_C_TREE_H
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) {}
};
#include <iostream>
#include <random>
#include <queue>
TreeNode *createRandomTree(int size)
{
if (size == 0)
{
return nullptr;
}
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<int> dis(1, 100);
std::queue<int> Q;
std::queue<TreeNode *> T;
for (int i = size; i > 0; --i)
{
Q.push(dis(gen));
std::cout << Q.back() << " ";
}
std::cout << std::endl;
TreeNode *head = new TreeNode(Q.front());
T.push(head);
Q.pop();
while (!Q.empty())
{
if (T.front()->left != nullptr && T.front()->right != nullptr)
{
T.pop();
}
TreeNode *temp = new TreeNode(Q.front());
Q.pop();
if (T.front()->left == nullptr)
{
T.front()->left = temp;
T.push(temp);
continue;
}
if (T.front()->right == nullptr)
{
T.front()->right = temp;
T.push(temp);
}
}
return head;
}
void lookTree(TreeNode *root)
{
std::queue<TreeNode *> q;
q.push(root);
while (!q.empty())
{
TreeNode *head = q.front();
q.pop();
std::cout << head->val << " ";
if (head->left)
{
q.push(head->left);
}
if (head->right)
{
q.push(head->right);
}
}
}
#endif // LEECODE_C_TREE_H

30
else/symmetry.h Normal file
View File

@@ -0,0 +1,30 @@
//
// Created by 李洋 on 2023/10/4.
//
#ifndef LEECODE_C_SYMMETRY_H
#define LEECODE_C_SYMMETRY_H
#include <string>
#include <stack>
bool isSymmetry(std::string target) {
std::stack<char> tk;
for (int i = 0; i < target.length(); ++i) {
if (i < target.length() / 2) {
tk.push(target[i]);
}
if (i == target.length() / 2 && target.length() % 2 == 1) {
i++;
}
if (i >= target.length() / 2) {
if (target[i] != tk.top()) {
return false;
}
tk.pop();
}
}
return true;
}
#endif //LEECODE_C_SYMMETRY_H

66
else/test1.h Normal file
View File

@@ -0,0 +1,66 @@
//
// Created by 李洋 on 2023/12/17.
//
#ifndef LEECODE_C_TEST1_H
#define LEECODE_C_TEST1_H
#include "stdlib.h"
typedef struct LinkNode {
char value;
struct LinkNode *next;
} *Node;
struct p {
int length;
Node head;
};
p create(Node l1) {
if (!l1) {
return p{0, nullptr}; //NULL
}
Node temp = (Node) malloc(sizeof(LinkNode));
temp->value = l1->value;
l1 = l1->next;
Node head = temp;
int length = 1;
while (l1) {
temp = (Node) malloc(sizeof(LinkNode));
temp->value = l1->value;
temp->next = head;
l1 = l1->next;
head = temp;
length++;
}
return p{length, head};
}
Node test(Node l1, Node l2) {
p p1 = create(l1);
p p2 = create(l2);
Node n1 = p1.head;
Node n2 = p2.head;
int index = 0;
while (n1->value == n2->value) {
n1 = n1->next;
n2 = n2->next;
index++;
}
Node ps = l1;
int length = p1.length - index;
while (length--) {
ps = ps->next;
}
return ps;
}
#endif //LEECODE_C_TEST1_H

76
else/topic/2017.h Normal file
View File

@@ -0,0 +1,76 @@
#include "../structs/Tree.h"
#include <queue>
using namespace std;
void reversechild(TreeNode *root)
{
TreeNode *head = root;
queue<TreeNode *> q;
q.push(head);
while (!q.empty())
{
head = q.front();
q.pop();
if (head->left)
{
q.push(head->left);
}
if (head->right)
{
q.push(head->right);
}
swap(head->left, head->right);
}
}
#include <unordered_map>
#include <vector>
using namespace std;
unordered_map<int, int> statistic(vector<int> L1)
{
unordered_map<int, int> m;
for (auto i : L1)
{
m[i] = m[i] + 1;
}
return m;
}
#include "../structs/List.h"
ListNode *integrateList(LitNode *L1, ListNode *l2)
{
ListNode *head = L1->value < L2->value ? L1 : L2;
if (L1->value < L2->value)
{
L1 = L1->next;
}
else
{
L2 = L2->next;
}
ListNode *temp = head->next;
while (L1 && L2)
{
temp->next = L1->value < L2->value ? L1 : L2;
if (L1->value < L2->value)
{
L1 = L1->next;
}
else
{
L2 = L2->next;
}
temp = temp->next;
}
if(L1){
temp->next = L1;
}
if(L2){
temp->next = L2;
}
return head;
}

60
else/topic/2019.h Normal file
View File

@@ -0,0 +1,60 @@
#include <vector>
using namespace std;
void odd_even(vector<int> &array)
{
int left = 0;
int right = array.size() - 1;
while (left < right)
{
while (left < right && array[right] % 2 == 0)
{
right--;
}
while (left < right && array[left] % 2 == 1)
{
left++;
}
swap(array[left], array[right]);
}
}
#include "../structs/Tree.h"
void insertSearchTree(TreeNode *root, int value)
{
TreeNode *dist = new TreeNode();
dist->val = value;
if (!root)
{
root = dist;
}
TreeNode *temp = root;
while (temp)
{
if (temp->val > value)
{
if (temp->left)
{
temp = temp->left;
continue;
}
temp->left = dist;
break;
}
if (temp->val < value)
{
if (temp->right)
{
temp = temp->right;
continue;
}
temp->left = dist;
break;
}
if (temp->val == value)
{
break;
}
}
}

28
else/topic/2020.h Normal file
View File

@@ -0,0 +1,28 @@
#include "../structs/Tree.h"
using namespace std;
TreeNode *getX(TreeNode *root, int x)
{
TreeNode *temp = root;
while (temp)
{
if (temp->val > x)
{
if (temp->left)
{
temp = temp->left;
continue;
}
}
else
{
if (temp->right)
{
temp = temp->right;
continue;
}
}
return temp;
}
}

35
else/topic/2021.h Normal file
View File

@@ -0,0 +1,35 @@
#include <vector>
#include <stack>
using namespace std;
int test1(vector<int> array)
{
if (array.empty())
{
return INT_MIN;
}
stack<int> S;
int norm = array[0];
int m = INT_MIN;
S.push(array[0]);
for (int i = 1; i < array.size(); i++)
{
m = max(m, norm - array[i]);
while (!S.empty() && array[i] > S.top())
{
S.pop();
}
if (S.empty())
{
norm = array[i];
}
S.push(array[i]);
}
return m;
}
#include "../structs/Tree.h"
int test2(TreeNode *root){
//先镜像,再按需遍历
}

66
else/topic/2022.h Normal file
View File

@@ -0,0 +1,66 @@
#include "../structs/List.h"
#include <vector>
using namespace std;
vector<vector<int>> test1(ListNode *head)
{
vector<vector<int>> ret;
int prev = head->value;
int index = 0;
ret.push_back(vector<int>(1, prev));
ListNode *temp = head->next;
while (!temp)
{
if (prev == temp->value)
{
index++;
}
else
{
index = 0;
}
if (index >= ret.size())
{
ret.push_back(vector<int>(1, temp->value));
}
if (index < ret.size())
{
ret[index].push_back(temp->value);
}
temp = temp->next;
}
return ret;
}
#include "../structs/Tree.h"
pair<bool, int> help(TreeNode *root)
{
if (!root)
{
return {true, 0};
}
auto p1 = help(root->left);
auto p2 = help(root->right);
if (!p1.first || !p2.first)
{
return {false, 0};
}
if (abs(p1.second - p2.second) > 1)
{
return {false, 0};
}
return {true, max(p1.second, p2.second) + 1};
}
bool test2(TreeNode *root)
{
return help(root).first;
}

21
else/topic/2023.h Normal file
View File

@@ -0,0 +1,21 @@
#include <vector>
#include<stack>
using namespace std;
bool test1(vector<int> array){
stack<int> S;
for (int i = 0; i < array.size()/2; i++)
{
S.push(array[i]);
}
int tag = array.size()%2;
for(int i = array.size()/2 + tag;i<array.size();i++){
if (S.top() != array[i])
{
return false;
}
S.pop();
}
return true;
}

58
else/topic/2024.h Normal file
View File

@@ -0,0 +1,58 @@
//
// Created by 李洋 on 2023/12/21.
//
#ifndef LEECODE_C_2024_H
#define LEECODE_C_2024_H
#include "stack"
struct Node {
int value;
struct Node *left;
struct Node *right;
bool tag1;
bool tag2;
};
using namespace std;
int calculate(stack<Node *> S) {
stack<Node *> temp;
int num = 0;
int i = 0;
while (!S.empty()) {
num += S.top()->value * pow(10, i++);
S.pop();
}
return num;
}
int get(Node *root) {
if (!root) {
return 0;
}
int count = 0;
stack<Node *> S;
S.push(root);
while (!S.empty()) {
if (!S.top()->left && !S.top()->right) {
count += calculate(S);
}
if (S.top()->tag1 == 0 && S.top()->left) {
S.top()->tag1 = 1;
S.push(S.top()->left);
continue;
}
if (S.top()->tag2 == 0 && S.top()->left) {
S.top()->tag2 = 1;
S.push(S.top()->right);
continue;
}
S.pop();
}
return count;
}
#endif //LEECODE_C_2024_H

138
else/traverse.h Normal file
View File

@@ -0,0 +1,138 @@
//
// Created by 李洋 on 2023/10/12.
//
#ifndef LEECODE_C_TRAVERSE_H
#define LEECODE_C_TRAVERSE_H
using namespace std;
#include "structs/Tree.h"
#include <queue>
#include <stack>
queue<TreeNode *> Q;
// 递归写法 - int型
// 先序遍历 preorder traversal
void preorder_recursion_help(TreeNode *head) {
if (head != nullptr) {
Q.push(head);
preorder_recursion_help(head->left);
preorder_recursion_help(head->right);
}
}
queue<TreeNode *> preorder_recursion(TreeNode *head) {
preorder_recursion_help(head);
return Q;
};
// 中序遍历 inorder traversal
void inorder_recursion_help(TreeNode *head) {
if (head != nullptr) {
inorder_recursion_help(head->left);
Q.push(head);
inorder_recursion_help(head->right);
}
}
queue<TreeNode *> inorder_recursion(TreeNode *head) {
inorder_recursion_help(head);
return Q;
};
// 后序遍历 postorder traversal
void postorder_recursion_help(TreeNode *head) {
if (head != nullptr) {
postorder_recursion_help(head->left);
postorder_recursion_help(head->right);
Q.push(head);
}
}
queue<TreeNode *> postorder_recursion(TreeNode *head) {
postorder_recursion_help(head);
return Q;
};
// 非递归写法
// 先序遍历 preorder traversal
queue<TreeNode *> preorder(TreeNode *head) {
if (!head) {
return Q;
}
auto temp = head;
stack < TreeNode * > S;
S.push(temp);
TreeNode *t;
while (!S.empty()) {
t = S.top();
S.pop();
Q.push(t);
if (t->right)
S.push(t->right);
if (t->left)
S.push(t->left);
}
return Q;
}
// 中序遍历 inorder traversal
queue<TreeNode *> inorder(TreeNode *head) {
auto temp = head;
stack < TreeNode * > S;
while (temp != nullptr || !S.empty()) {
if (temp) {
S.push(temp);
temp = temp->left;
continue;
}
temp = S.top();
Q.push(temp);
S.pop();
temp = temp->right;
}
return Q;
}
// 后序遍历 postorder traversal
queue<TreeNode *> postorder(TreeNode *head) {
auto temp = head;
stack <pair<TreeNode *, bool>> S;
while (temp != nullptr || !S.empty()) {
if (temp) {
S.emplace(temp, false);
temp = temp->left;
continue;
}
temp = S.top().first;
if (temp->right == nullptr || S.top().second) {
Q.push(temp);
S.pop();
temp = nullptr;
continue;
}
S.top().second = true;
temp = temp->right;
}
return Q;
}
void test1() {
auto TreeNode = createRandomTree(10);
auto Q = postorder(TreeNode);
while (!Q.empty()) {
cout << Q.front()->val << " ";
Q.pop();
}
}
#endif //LEECODE_C_TRAVERSE_H