二叉树遍历(递归、迭代)

前中后序遍历

  • 递归法

    //前序遍历
    var preorderTraversal = function(root) {
    let res=[];
    const dfs=function(root){
        if(root===null)return ;
        //先序遍历所以从父节点开始
        res.push(root.val);
        //递归左子树
        dfs(root.left);
        //递归右子树
        dfs(root.right);
    }
    //只使用一个参数 使用闭包进行存储结果
    dfs(root);
    return res;
    };
    //中序遍历
    var inorderTraversal = function(root) {
       let res=[];
       const dfs=function(root){
           if(root===null){
               return ;
          }
           dfs(root.left);
           res.push(root.val);
           dfs(root.right);
      }
       dfs(root);
       return res;
    };
    //后序遍历
    var postorderTraversal = function(root) {
       let res=[];
       const dfs=function(root){
           if(root===null){
               return ;
          }
           dfs(root.left);
           dfs(root.right);
           res.push(root.val);
      }
       dfs(root);
       return res;
    };

     

  • 迭代法

前序遍历:

// 入栈 右 -> 左
// 出栈 中 -> 左 -> 右
var preorderTraversal = function(root, res = []) {
   if(!root) return res;
   const stack = [root];
   let cur = null;
   while(stack.length) {
       cur = stack.pop();
       res.push(cur.val);
       cur.right && stack.push(cur.right);
       cur.left && stack.push(cur.left);
  }
   return res;
};

中序遍历:

// 入栈 左 -> 右
// 出栈 左 -> 中 -> 右

var inorderTraversal = function(root, res = []) {
   const stack = [];
   let cur = root;
   while(stack.length || cur) {
       if(cur) {
           stack.push(cur);
           // 左
           cur = cur.left;
      } else {
           // --> 弹出 中
           cur = stack.pop();
           res.push(cur.val);
           // 右
           cur = cur.right;
      }
  };
   return res;
};

详细版
   const res = []
   if (root === null) {
  return res
  }
   const stack = []
   let temp = root
   while (temp !== nul1){
       stack.push(temp)
       temp = temp. left
  }
   
   while (stack.length > 0) {
       const current = stack.pop()
       res.push(current.val)
       if ( current.right !== null) {
           let temp2 = current.right
           while (temp2 !== null) {
               stack.push(temp2)
               temp2 = temp2.left
          }
  }
  }
   return res


后序遍历:

// 入栈 左 -> 右
// 出栈 中 -> 右 -> 左 结果翻转

var postorderTraversal = function(root, res = []) {
   if (!root) return res;
   const stack = [root];
   let cur = null;
   do {
       cur = stack.pop();
       res.push(cur.val);
       cur.left && stack.push(cur.left);
       cur.right && stack.push(cur.right);
  } while(stack.length);
   return res.reverse();
};

1

posted @ 2022-09-22 22:42  衣囧~  阅读(129)  评论(0编辑  收藏  举报