LeetCode 树的前、中、后序遍历

1. 树的各种遍历方法可以说是基本要求了,用递归方式去做,套一个模板就可以,我们主要考虑如何使用迭代法去做,递归代码直接给出:

var preorderTraversal = function(root) {
  let ans = [];
  function preorder(root) {
    if (!root) {
      return [];
    }
    ans.push(root.val);
    preorder(root.left);
    preorder(root.right);
  }
  preorder(root);
  return ans;
};
  var postorderTraversal = function(root) {
  let ans = [];
  function postorder(root) {
    if (!root) {
      return [];
    }
    postorder(root.left);
    postorder(root.right);
    ans.push(root.val);
  }
  postorder(root);
  return ans;
};
var inorderTraversal = function(root) {
  let arr = [];
  function inorder(root) {
    if (!root) {
      return [];
    }
    inorder(root.left);
    arr.push(root.val);
    inorder(root.right);
  }
  inorder(root);
  return arr;
};

2. 迭代算法:

【1】前序遍历:利用栈数据结构,先将节点遍历至最左节点,此过程中节点和值依次入栈(stack、vals),直到遇到节点为空,然后将栈顶元素出栈,寻找其右节点,再次循环此过程......

var preorderTraversal = function(root) {
  let stack = [];
  let vals = [];
  let cur = root;
  while (stack.length || cur) {
    while (cur) {
      stack.push(cur);
      vals.push(cur.val);
      cur = cur.left;
    }
    cur = stack.pop().right;
  }
  return vals;
};

【2】中序遍历:类似前序遍历,但有微小变化。

var inorderTraversal = function(root) {
  let arr = [];
  let stack = [];
  let cur = root;
  while (stack.length || cur) {
    while (cur) {
      stack.push(cur);
      cur = cur.left;
    }
    cur = stack.pop();
    arr.push(cur.val);
    cur = cur.right;
  }
  return arr;
};

【3】后序遍历:我们知道前序遍历的顺序是 根结点 -> 左节点 -> 右节点,后序遍历的顺序是 左节点 -> 右节点 -> 根结点。

因此我们对前序遍历做修改,遍历到最左节点,改为最右节点,这样顺序就变成了 根结点 -> 右节点 -> 左节点,再对结果数组进行 reverse(),则顺序变成了 左节点 -> 右节点 -> 根结点。

var postorderTraversal = function(root) {
  let stack = [];
  let ans = [];
  let cur = root;
  while (stack.length || cur) {
    while (cur) {
      stack.push(cur);
      ans.push(cur.val);
      cur = cur.right;
    }
    cur = stack.pop().left;
  }
  return ans.reverse();
};
posted @ 2021-09-28 22:28  TwinkleG  Views(78)  Comments(0)    收藏  举报