|
77 | 77 |
|
78 | 78 | (待补充.....) |
79 | 79 |
|
| 80 | +# 算法模板 |
| 81 | + |
| 82 | +## 二分法 |
| 83 | +(待补充....) |
| 84 | + |
| 85 | +## KMP |
| 86 | + |
| 87 | +(待补充....) |
| 88 | + |
| 89 | +## 二叉树 |
| 90 | + |
| 91 | +### 深度优先遍历(递归) |
| 92 | + |
| 93 | +前序遍历(中左右) |
| 94 | +``` |
| 95 | +void traversal(TreeNode* cur, vector<int>& vec) { |
| 96 | + if (cur == NULL) return; |
| 97 | + vec.push_back(cur->val); // 中 ,同时也是处理节点逻辑的地方 |
| 98 | + traversal(cur->left, vec); // 左 |
| 99 | + traversal(cur->right, vec); // 右 |
| 100 | +} |
| 101 | +``` |
| 102 | +中序遍历(左中右) |
| 103 | +``` |
| 104 | +void traversal(TreeNode* cur, vector<int>& vec) { |
| 105 | + if (cur == NULL) return; |
| 106 | + traversal(cur->left, vec); // 左 |
| 107 | + vec.push_back(cur->val); // 中 ,同时也是处理节点逻辑的地方 |
| 108 | + traversal(cur->right, vec); // 右 |
| 109 | +} |
| 110 | +``` |
| 111 | +中序遍历(中左右) |
| 112 | +``` |
| 113 | +void traversal(TreeNode* cur, vector<int>& vec) { |
| 114 | + if (cur == NULL) return; |
| 115 | + vec.push_back(cur->val); // 中 ,同时也是处理节点逻辑的地方 |
| 116 | + traversal(cur->left, vec); // 左 |
| 117 | + traversal(cur->right, vec); // 右 |
| 118 | +} |
| 119 | +``` |
| 120 | + |
| 121 | +### 深度优先遍历:迭代法(使用栈模拟递归) |
| 122 | + |
| 123 | +相关题解:[0094.二叉树的中序遍历](https://github.com/youngyangyang04/leetcode/blob/master/problems/0094.二叉树的中序遍历.md) |
| 124 | + |
| 125 | +前序遍历(中左右) |
| 126 | +``` |
| 127 | +vector<int> preorderTraversal(TreeNode* root) { |
| 128 | + vector<int> result; |
| 129 | + stack<TreeNode*> st; |
| 130 | + if (root != NULL) st.push(root); |
| 131 | + while (!st.empty()) { |
| 132 | + TreeNode* node = st.top(); |
| 133 | + if (node != NULL) { |
| 134 | + st.pop(); |
| 135 | + if (node->right) st.push(node->right); // 右 |
| 136 | + if (node->left) st.push(node->left); // 左 |
| 137 | + st.push(node); // 中 |
| 138 | + st.push(NULL); |
| 139 | + } else { |
| 140 | + st.pop(); |
| 141 | + node = st.top(); |
| 142 | + st.pop(); |
| 143 | + result.push_back(node->val); // 节点处理逻辑 |
| 144 | + } |
| 145 | + } |
| 146 | + return result; |
| 147 | +} |
| 148 | +
|
| 149 | +``` |
| 150 | + |
| 151 | +中序遍历(左中右) |
| 152 | +``` |
| 153 | +vector<int> inorderTraversal(TreeNode* root) { |
| 154 | + vector<int> result; // 存放中序遍历的元素 |
| 155 | + stack<TreeNode*> st; |
| 156 | + if (root != NULL) st.push(root); |
| 157 | + while (!st.empty()) { |
| 158 | + TreeNode* node = st.top(); |
| 159 | + if (node != NULL) { |
| 160 | + st.pop(); |
| 161 | + if (node->right) st.push(node->right); // 右 |
| 162 | + st.push(node); // 中 |
| 163 | + st.push(NULL); |
| 164 | + if (node->left) st.push(node->left); // 左 |
| 165 | + } else { |
| 166 | + st.pop(); |
| 167 | + node = st.top(); |
| 168 | + st.pop(); |
| 169 | + result.push_back(node->val); // 节点处理逻辑 |
| 170 | + } |
| 171 | + } |
| 172 | + return result; |
| 173 | +} |
| 174 | +``` |
| 175 | + |
| 176 | +后序遍历(左右中) |
| 177 | +``` |
| 178 | +vector<int> postorderTraversal(TreeNode* root) { |
| 179 | + vector<int> result; |
| 180 | + stack<TreeNode*> st; |
| 181 | + if (root != NULL) st.push(root); |
| 182 | + while (!st.empty()) { |
| 183 | + TreeNode* node = st.top(); |
| 184 | + if (node != NULL) { |
| 185 | + st.pop(); |
| 186 | + st.push(node); // 中 |
| 187 | + st.push(NULL); |
| 188 | + if (node->right) st.push(node->right); // 右 |
| 189 | + if (node->left) st.push(node->left); // 左 |
| 190 | +
|
| 191 | + } else { |
| 192 | + st.pop(); |
| 193 | + node = st.top(); |
| 194 | + st.pop(); |
| 195 | + result.push_back(node->val); // 节点处理逻辑 |
| 196 | + } |
| 197 | + } |
| 198 | + return result; |
| 199 | +} |
| 200 | +``` |
| 201 | +### 广度优先遍历(队列) |
| 202 | + |
| 203 | +相关题解:[0102.二叉树的层序遍历](https://github.com/youngyangyang04/leetcode/blob/master/problems/0102.二叉树的层序遍历.md) |
| 204 | + |
| 205 | +``` |
| 206 | +vector<vector<int>> levelOrder(TreeNode* root) { |
| 207 | + queue<TreeNode*> que; |
| 208 | + if (root != NULL) que.push(root); |
| 209 | + vector<vector<int>> result; |
| 210 | + while (!que.empty()) { |
| 211 | + int size = que.size(); |
| 212 | + vector<int> vec; |
| 213 | + for (int i = 0; i < size; i++) {// 这里一定要使用固定大小size,不要使用que.size() |
| 214 | + TreeNode* node = que.front(); |
| 215 | + que.pop(); |
| 216 | + vec.push_back(node->val); // 节点处理的逻辑 |
| 217 | + if (node->left) que.push(node->left); |
| 218 | + if (node->right) que.push(node->right); |
| 219 | + } |
| 220 | + result.push_back(vec); |
| 221 | + } |
| 222 | + return result; |
| 223 | +} |
| 224 | +
|
| 225 | +``` |
| 226 | + |
| 227 | +### 二叉树深度 |
| 228 | + |
| 229 | +### 二叉树节点数量 |
| 230 | + |
80 | 231 | # LeetCode 最强题解: |
81 | 232 |
|
82 | 233 | |题目 | 类型 | 难度 | 解题方法 | |
|
0 commit comments