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

前中后序遍历

  • 递归法

    //前序遍历
    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


__EOF__

本文作者衣囧~
本文链接https://www.cnblogs.com/user-yi/p/16721125.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   衣囧~  阅读(130)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
点击右上角即可分享
微信分享提示