DFS
:完全遍历,找到 符合设定条件 的所有结果
,时间复杂度高
BFS
:部分遍历,找到 最短/最小的结果
,空间复杂度高
int BFS(Node start, Node target) { deque<Node> q;//--核心数据结构 set<Node> visited;//--避免走回头路的数据结构 q.push_back(start);/* 将起点加入deque和visited */ visited.insert(start); int step = 0; while(!q.empty()){/* deque非空则循环 */ int sz = q.size(); for(int i = 0; i < sz; ++i){/* 循环遍历队列节点 */ Node cur = q.front();/* 取出队列最前面的节点cur */ q.pop_front(); if(cur.val == target.val)/* 判断是否结束 */ return step; /* 对 本层数据 自定义操作 */ /* 循环遍历cur的邻居节点, 如果没有visited过,则加入到deque和visited中*/ for(Node *nei: cur.neigh){ if(nei not in visited){ q.push_back(nei); visited.insert(nei); } } } /* 最后次数++ */ ++step; } }
未完成?
bool backtrace(路径,选择,选择列表) { if(满足退出条件){ result.add(路径); return true; } if(不满足路径条件){ return false; } 当前选择,加入路径(); for(下一选择 in 选择列表){ backtrace(新的路径,下一选择,选择列表); //--if(backtrace(路径,下一选择,选择列表)) //-- return true; } 撤销选择,退出路径(); return false; }
旧
bool backtrace(路径,选择列表) { if(满足退出条件) result.add(路径); return true; if(不满足路径条件) return false; for(选择 in 选择列表) 做选择,加入原路径(); if( backtrace(下一递推路径,选择列表) ) return true; 撤销选择,退出原路径(); return false; }
非查找边界的版本:
int binarySearch(int[] nums, int target) { int left = 0; int right = nums.length - 1; // 注意 while(left <= right) { // 注意 int mid = (right + left) / 2; if(nums[mid] == target) return mid; else if (nums[mid] < target) left = mid + 1; // 注意 else if (nums[mid] > target) right = mid - 1; // 注意 } return -1; }
参考:https://mp.weixin.qq.com/s?__biz=MzAxODQxMDM0Mw==&mid=2247484507&idx=1&sn=36b8808fb8fac0e1906493347d3c96e6&chksm=9bd7fa53aca0734531ec9f37127c0f371344e1690918888dfb1cfdf043c40c0b43d1121e5851&scene=21#wechat_redirect
void traverse(Node * root) if(root == nullptr) return; //前序遍历 traverse(root->left); //中序遍历 traverse(root->right); //后序遍历