Skip to content

递归法

1. 前序遍历

js
const 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;
};

2.中序遍历

js
const 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;
};

3.后序遍历

js
const 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;
};

迭代法(利用栈和标记节点)

前序遍历

js
const preorderTraversal = function(root, res = []) {
    const stack = [];
    if (root) stack.push(root);
    while(stack.length) {
        const node = stack.pop();
        if(!node) {
          // null节点标记,下一个为中间节点,处理
            res.push(stack.pop().val);
            continue;
        }
        if (node.right) stack.push(node.right); // 右
        if (node.left) stack.push(node.left); // 左
        stack.push(node); // 中
        stack.push(null); // 标记节点
    };
    return res;
};

中序遍历

js
const inorderTraversal = function(root, res = []) {
    const stack = [];
    if (root) stack.push(root);
    while(stack.length) {
        const node = stack.pop();
        if(!node) {
          // null节点标记,下一个为中间节点,处理
            res.push(stack.pop().val);
            continue;
        }
        if (node.right) stack.push(node.right); // 右
        stack.push(node); // 中
        stack.push(null);
        if (node.left) stack.push(node.left); // 左
    };
    return res;
};

后序遍历

js
const postorderTraversal = function(root, res = []) {
    const stack = [];
    if (root) stack.push(root);
    while(stack.length) {
        const node = stack.pop();
        if(!node) {
          // null节点标记,下一个为中间节点,处理
            res.push(stack.pop().val);
            continue;
        }
        stack.push(node); // 中
        stack.push(null);
        if (node.right) stack.push(node.right); // 右
        if (node.left) stack.push(node.left); // 左
    };
    return res;
};