@@ -132,12 +132,158 @@ https://github.com/CarpenterLee/JCFInternals/blob/049c84bb65a3114ba4b8355d83c490
132132
133133#### 二分查找法
134134
135- #### 二叉树遍历
135+ 在有序表中,通过不断的二分判断mid与目标是否一致,并缩小目标所在区间。
136136
137- ### 4.. 二分搜索树
137+ ** 代码实现**
138+
139+ ``` java
140+ // 非递归实现
141+ private static int search(int [] data, int l, int r, int target) {
142+ int mid;
143+ while (l < r) {
144+ mid = (l + r) / 2 ;
145+ if (data[mid] == target) {
146+ return mid;
147+ } else if (data[mid] < target) {
148+ l = mid + 1 ;
149+ } else {
150+ r = mid;
151+ }
152+ }
153+ return - 1 ;
154+ }
155+ // 递归实现
156+ private static int searchDfs(int [] data, int l, int r, int target) {
157+ if (l >= r) {
158+ return - 1 ;
159+ }
160+ int mid = (l + r) / 2 ;
161+ if (target == data[mid]) {
162+ return mid;
163+ } else if (target > data[mid]) {
164+ return searchDfs(data, mid + 1 , r, target);
165+ } else {
166+ return searchDfs(data, l, mid, target);
167+ }
168+ }
169+ ```
170+
171+ #####
172+
173+ ### 4.. 二叉树遍历
138174
139175#### 深度优先遍历(前序、中序、后序遍历)
140176
177+ ``` C++
178+ /* *
179+ * 前序遍历 非递归实现
180+ * Definition for a binary tree node.
181+ * struct TreeNode {
182+ * int val;
183+ * TreeNode *left;
184+ * TreeNode *right;
185+ * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
186+ * };
187+ */
188+ class Solution {
189+ public:
190+ vector<int > preorderTraversal(TreeNode* root) {
191+ vector<int > ans;
192+ TreeNode* node = root;
193+ stack<TreeNode* > s;
194+ map<TreeNode* , bool> M;
195+ if(node != NULL) {
196+ s.push(node);
197+ while (!s.empty()) {
198+ node = s.top();
199+ if (!M[ node] ) {
200+ ans.push_back(node->val);
201+ M[ node] = true;
202+ }
203+ if (node->left != NULL) {
204+ s.push(node->left);
205+ node->left = NULL;
206+ } else if (node->right != NULL) {
207+ s.push(node->right);
208+ node->right = NULL;
209+ } else {
210+ s.pop();
211+ }
212+ }
213+ }
214+ return ans;
215+ }
216+ };
217+ ```
218+
219+ ```c++
220+ /**
221+ * 中序遍历
222+ * Definition for a binary tree node.
223+ * struct TreeNode {
224+ * int val;
225+ * TreeNode *left;
226+ * TreeNode *right;
227+ * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
228+ * };
229+ */
230+ class Solution {
231+ public:
232+ vector<int> inorderTraversal(TreeNode* root) {
233+ vector<int> ans;
234+ if(root != NULL) {
235+ traversal(root, ans);
236+ }
237+ return ans;
238+ }
239+
240+ void traversal(TreeNode* node, vector<int> &ans) {
241+ if(node->left != NULL) {
242+ traversal(node->left, ans);
243+ }
244+ ans.push_back(node->val);
245+ if(node->right != NULL) {
246+ traversal(node->right, ans);
247+ }
248+ }
249+ };
250+ ```
251+
252+
253+
254+ ``` c++
255+ /* *
256+ * 后序遍历
257+ * Definition for a binary tree node.
258+ * struct TreeNode {
259+ * int val;
260+ * TreeNode *left;
261+ * TreeNode *right;
262+ * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
263+ * };
264+ */
265+ class Solution {
266+ public:
267+ vector<int > postorderTraversal(TreeNode* root) {
268+ vector<int > ans;
269+ if(root != NULL) {
270+ traversal(root, ans);
271+ }
272+ return ans;
273+ }
274+
275+ void traversal(TreeNode* node, vector<int> &ans) {
276+ if(node->left != NULL) {
277+ traversal(node->left, ans);
278+ }
279+ if (node->right != NULL ) {
280+ traversal (node->right, ans);
281+ }
282+ ans.push_back(node->val);
283+ }
284+ };
285+ ```
286+
141287#### 广度优先遍历(层序遍历)
142288
143289### 5. AVL树
0 commit comments