1. 链表
#include <iostream>
#include <vector>
using namespace std;
template <typename T>
struct ListNode {
T data;
ListNode<T>* prev;
ListNode<T>* next;
ListNode() : prev(nullptr), next(nullptr) {}
ListNode(T val) : data(val), prev(nullptr), next(nullptr) {}
ListNode(T val, ListNode<T>* p_prev, ListNode<T>* p_next)
: data(val), prev(p_prev), next(p_next) {}
};
template <typename T>
ListNode<T>* buildDoublyLinkedList(const vector<T>& arr) {
if (arr.empty()) {
return nullptr;
}
ListNode<T>* head = new ListNode<T>(arr[0]);
ListNode<T>* current = head;
for (size_t i = 1; i < arr.size(); ++i) {
ListNode<T>* newNode = new ListNode<T>(arr[i], current, nullptr);
current->next = newNode;
current = newNode;
}
return head;
}
template <typename T>
void printListForward(ListNode<T>* head) {
ListNode<T>* current = head;
while (current != nullptr) {
cout << current->data << " ";
current = current->next;
}
cout << endl;
}
template <typename T>
void printListBackward(ListNode<T>* head) {
if (head == nullptr) {
cout << "空链表" << endl;
return;
}
ListNode<T>* tail = head;
while (tail->next != nullptr) {
tail = tail->next;
}
while (tail != nullptr) {
cout << tail->data << " ";
tail = tail->prev;
}
cout << endl;
}
template <typename T>
void deleteList(ListNode<T>* head) {
ListNode<T>* current = head;
while (current != nullptr) {
ListNode<T>* nextNode = current->next;
delete current;
current = nextNode;
}
}
int main() {
vector<int> arrInt = {1, 2, 3, 4, 5};
ListNode<int>* headInt = buildDoublyLinkedList(arrInt);
cout << "int类型链表正向遍历:";
printListForward(headInt);
cout << "int类型链表反向遍历:";
printListBackward(headInt);
deleteList(headInt);
vector<string> arrStr = {"A", "B", "C", "D"};
ListNode<string>* headStr = buildDoublyLinkedList(arrStr);
cout << "string类型链表正向遍历:";
printListForward(headStr);
cout << "string类型链表反向遍历:";
printListBackward(headStr);
deleteList(headStr);
return 0;
}
2. 二叉树
#include <stdio.h>
#include <vector>
#include <stdlib.h>
#include <iostream>
#include <deque>
#include <queue>
using namespace std;
template <typename T>
struct TreeNode {
T val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(T()), left(nullptr), right(nullptr) {}
TreeNode(const T& x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(const T& x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
template <typename T>
TreeNode<T>* buildTreeByLevelOrder(const vector<T*>& levelOrder) {
if(levelOrder.empty() || levelOrder[0] == nullptr) {
return nullptr;
}
TreeNode<T>* root = new TreeNode<T>(*levelOrder[0]);
queue<TreeNode<T>*> nodeQueue;
nodeQueue.push(root);
int index = 1;
int n = levelOrder.size();
while(!nodeQueue.empty() && index < n) {
TreeNode<T>* current = nodeQueue.front();
nodeQueue.pop();
if(index < n && levelOrder[index] != nullptr) {
current->left = new TreeNode<T>(*levelOrder[index]);
nodeQueue.push(current->left);
}
index++;
if(index < n && levelOrder[index] != nullptr) {
current->right = new TreeNode<T>(*levelOrder[index]);
nodeQueue.push(current->right);
}
index++;
}
return root;
}
template <typename T>
void levelOrderTraversal(TreeNode<T>* root) {
if (root == nullptr) {
cout << "空树" << endl;
return;
}
queue<TreeNode<T>*> q;
q.push(root);
while (!q.empty()) {
TreeNode<T>* node = q.front();
q.pop();
cout << node->val << " ";
if (node->left != nullptr) {
q.push(node->left);
}
if (node->right != nullptr) {
q.push(node->right);
}
}
cout << endl;
}
int main() {
int v1 = 3, v2 = 9, v3 = 20, v4 = 15, v5 = 7;
vector<int*> levelOrderInt = {&v1, &v2, &v3, nullptr, nullptr, &v4, &v5};
TreeNode<int>* rootInt = buildTreeByLevelOrder(levelOrderInt);
cout << "int类型树的层序遍历:";
levelOrderTraversal(rootInt);
string s1 = "A", s2 = "B", s3 = "C", s4 = "D", s5 = "E";
vector<string*> levelOrderStr = {&s1, &s2, &s3, nullptr, nullptr, &s4, &s5};
TreeNode<string>* rootStr = buildTreeByLevelOrder(levelOrderStr);
cout << "string类型树的层序遍历:";
levelOrderTraversal(rootStr);
return 0;
}