const root = {
val: "A",
left: {
val: "B",
left: {
val: "D"
},
right: {
val: "E"
}
},
right: {
val: "C",
right: {
val: "F"
}
}
};
先序遍历
function preOrder (root) {
if (!root){
return
}
console.log('当前遍历的节点',root.val);
preOrder(root.left)
preOrder(root.right)
}
中序遍历
function inOrder (root) {
if (!root){
return
}
inOrder(root.left)
console.log('当前遍历的节点',root.val);
inOrder(root.right)
}
后续遍历
function postOrder (root) {
if (!root){
return
}
postOrder(root.left)
postOrder(root.right)
console.log('当前遍历的节点',root.val);
}
判断回文
function isPalindrome (str) {
let myStr = str.split('').reverse().join('')
if(myStr == str){
return true
}
}
function xxx(入参) {
前期的变量定义、缓存等准备工作
const path = []
dfs(起点)
dfs(递归参数) {
if(到达了递归边界) {
结合题意处理边界逻辑,往往和 path 内容有关
return
}
for(遍历坑位的可选值) {
path.push(当前选中值)
处理坑位本身的相关逻辑
path.pop()
}
}
}
tips :
- 双指针方法在求和、比大小里面有奇效,但是往往需要数组有序
- 回文的特性 : 对称性
- dummy节点就是人为的在链表前增加一个节点
- 快慢指针,解决删除节点问题
- 环形链表,通过确立 FLAG 的方式,如果遍历可以再次访问到 FLAG ,说明这是一个环形链表
- 将一个堆,放在另一个堆里,两个就组成了一个栈
- 可以使用双端队列辅助解题
- 回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试
- 深度遍历 DFS 就是 堆, 广度遍历 BFS 就是 队列
- 平衡二叉树,递归取中间节点