算法整理

140 阅读1分钟
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(起点) 
  
  // 定义 dfs
  dfs(递归参数) {
    if(到达了递归边界) {
      结合题意处理边界逻辑,往往和 path 内容有关
      return   
    }
    
    // 注意这里也可能不是 for,视题意决定
    for(遍历坑位的可选值) {
      path.push(当前选中值)
      处理坑位本身的相关逻辑
      path.pop()
    }
  }
}

tips :

  • 双指针方法在求和、比大小里面有奇效,但是往往需要数组有序
  • 回文的特性 : 对称性
  • dummy节点就是人为的在链表前增加一个节点
  • 快慢指针,解决删除节点问题
  • 环形链表,通过确立 FLAG 的方式,如果遍历可以再次访问到 FLAG ,说明这是一个环形链表
  • 将一个堆,放在另一个堆里,两个就组成了一个栈
  • 可以使用双端队列辅助解题
  • 回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试
  • 深度遍历 DFS 就是 堆, 广度遍历 BFS 就是 队列
  • 平衡二叉树,递归取中间节点