# 二叉树

# 前序遍历

/* 
  前序遍历(先遍历父元素)
  以根节点为起始点
  先遍历根节点左边,左节点有子节点,则继续遍历子节点的左边
  左边左侧一直到底,然后再处理左边右侧,左边完了之后再处理右边
  先右边左侧,然后右边右侧。
*/
function preorderTraversal(root) {
  let res = [];
  // 遍历函数
  function traversal(root) {
    if (root == null) return
    // 访问根节点的值
    res.push(root.val);
    // 递归遍历左子树
    traversal(root.left);
    // 递归遍历右子树
    traversal(root.right);
  };
  traversal(root);
  return res;
};

# 中序遍历

/* 
  中序遍历(先左边,然后遍历父元素,最后遍历右边)
  以左边左侧叶子节点为起始点
  先遍历根节点左边,左节点有子节点,则继续遍历子节点的左边
  左边左侧一直到底,然后再处理左边右侧,左边完了之后再处理右边
  先右边左侧,然后右边右侧。
*/
function inorderTraversal(root) {
  let res = [];
  // 遍历函数
  function traversal(root) {
    if (root == null) return 
    // 递归遍历左子树
    traversal(root.left);
    // 访问根节点的值
    res.push(root.val);
    // 递归遍历右子树
    traversal(root.right);
  };
  traversal(root);
  return res;
};

# 后序遍历

/*  
  后序遍历(先左边,后右边,最后遍历中间)
  以左边左侧叶子节点为起始点
  先遍历根节点左边,左节点有子节点,则继续遍历子节点的左边
  左边左侧一直到底,然后再处理左边右侧,左边完了之后再处理右边
  先右边左侧,然后右边右侧。
*/
function postorderTraversal(root) {
  let res = [];
  // 遍历函数
  function traversal(root) {
    if (root == null) return
    // 递归遍历左子树
    traversal(root.left);
    // 递归遍历右子树
    traversal(root.right);
    // 访问根节点的值
    res.push(root.val);
  };
  traversal(root);
  return res;
};

# 层序遍历

/*  
  层序遍历(一层一层的向下遍历)
*/
function levelorderTraversal(root) {
  let stack = [root]
  let index = 0
  let res = [];
  let curNode
  while(curNode = stack[index++]){
    res.push(curNode.val);
    curNode.left ? stack.push(curNode.left) : null
    curNode.right ? stack.push(curNode.right) : null
  }
  return res;
};

# 反转二叉树

/*  
  反转二叉树(将左边节点换到右边,右边换到左边)
*/
function reverseTree(root) {
  let stack = [root];
  let index = 0;
  let curNode;
  while (curNode = stack[index++]) {
    const { left, right } = curNode
    curNode.right = left
    curNode.left = right
    if(left){ stack.push(left) }
    if(right){ stack.push(right) }
  }
  stack = null;
  return root;
}
上次更新: 6/25/2021, 6:21:35 PM