树遍历等复习

这篇博客介绍了四种常见的树遍历方法——中序遍历、前序遍历、后序遍历和层序遍历,分别提供了递归和迭代两种实现方式。此外,还详细讲解了如何通过递归计算树的最大深度。这些内容对于理解和操作二叉树结构至关重要。
摘要由CSDN通过智能技术生成

很基础的知识,简单复习,做个记录

/* 中序遍历 */

// t94 - 中序遍历 - 递归   68 ms	37.7 MB
var inorderTraversal = function(root,res = []) {

    if(!root) return res;

        inorderTraversal(root.left,res);
        res.push(root.val);
        inorderTraversal(root.right,res);

    return res;
};

// t94 - 中序遍历 - 迭代  64 ms	37.9 MB
let stack = [], res = [], r = root;
    while (r) { stack.push(r); r = r.left; }

    while (stack.length > 0) {
        let mid = stack.pop(); // 取出来的是left已经访问完的中部节点
        res.push(mid.val);

        if (mid.right) {
            r = mid.right;
            while (r) { stack.push(r); r = r.left; } 
        }
    }
    
    return res;


// t144 - 前序遍历 - 迭代  92 ms	37.8 MB
var preorderTraversal = function(root) {
    let res = [],stack = [root];
    if(!root) return res;
    while(stack.length > 0){
        let t = stack.pop();
        res.push(t.val);
        if(t.right) stack.push(t.right);
        if(t.left) stack.push(t.left);
    }

    return res;
};

// t145 - 后序遍历 - 迭代   72 ms	38.9 MB

var postorderTraversal = function (root) {
    let stack = [], res = [];
    if (!root) return res;

    let r = root;
    while (r) {
        stack.push([r,0]);
        r = r.left;
    }

    while (stack.length > 0) {
        let [mid,tag] = stack.pop();
        if (mid.right && tag == 0) {
            stack.push([mid,1]);
            r = mid.right;
            while (r) {
                stack.push([r,0]);
                r = r.left;
            }
        } else{
            res.push(mid.val);
        }
    }

    return res;
};


/* 层序遍历 */

// t102 - 层序遍历 - 迭代  72 ms	39.7 MB
 /* @param {TreeNode} root
 * @return {number[][]}
 */
var levelOrder = function(root) {
    if(!root) return [];
    let que = [[root,0]],res = [];//结果要求二维数组,所以登记了层数
    while(que.length > 0){
        let tmp = que.shift();
        if(res[tmp[1]]) res[tmp[1]].push(tmp[0].val)
        else res[tmp[1]] = [tmp[0].val];
        if(tmp[0].left) que.push([tmp[0].left,tmp[1]+1]);
        if(tmp[0].right) que.push([tmp[0].right,tmp[1]+1]);
    }
    return res;
};

// t102 - 层序遍历 - 迭代  84 ms	39.3 MB
var levelOrder = function(root) {
    if(!root) return [];
    let que = [root],res = [];
    while(que.length > 0){
        let len = que.length; // 不登记层数,记录本层层数也可。
        let t = [];
        while(len){
            t.push(que[0].val);
            if(que[0].left) que.push(que[0].left);
            if(que[0].right) que.push(que[0].right);
            que.shift();
            len--;
        }
        res.push(t);
    }
    return res;
};

/* 求树深度 */
//  t104 - 树深度 - 递归  72 ms	40.7 MB
/**
 * @param {TreeNode} root
 * @return {number}
 */
var maxDepth = function (root) {
    function height(node) {
        if (!node) return 0;
        let [hl, hr] = [height(node.left), height(node.right)];
        return hl > hr ? hl + 1 : hr + 1;
    }
    // 内部写函数快过直接 MaxDepth 递归

    return height(root);
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值