js实现二叉树遍历

Posted 遥岑.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js实现二叉树遍历相关的知识,希望对你有一定的参考价值。

目录

二叉树

二叉树是树中每个节点最多只能有两个子节点的树。

分类:

  • 满二叉树
    如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。

  • 完全二叉树
    在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2^(h-1) 个节点。

  • 二叉搜索树
    二叉搜索树是一个有序树。

  • 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;

  • 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

  • 它的左、右子树也分别为二叉排序树

  • 平衡二叉树
    它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

二叉树遍历

前序遍历

  • 根-左-右
  • 递归
var preorderTraversal = function(root) 
    let res = []
    function pre(node) 
        if(node === null) return
        res.push(node.val)
        pre(node.left)
        pre(node.right)
    
    pre(root)
    return res
;
  • 迭代
var preorderTraversal = function(root) 
    let res = []
    let stack = [root]
    while(stack.length) 
        let n = stack.pop()
        if(n) 
            res.push(n.val)
            stack.push(n.right)
            stack.push(n.left)
        
        
    
    return res
;

中序遍历

  • 左-根-右

  • 递归

var inorderTraversal = function(root) 
    let res = []
    function ino(root) 
        // root为null终止条件
        if(!root) return
        ino(root.left)
        res.push(root.val)
        ino(root.right)
    
    ino(root)
    return res
;
  • 迭代
var inorderTraversal = function(root) 
    // 迭代
    let stack = []
    let res = []
    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
;

后序遍历

  • 左-右-根

  • 递归

var postorderTraversal = function(root) 
    let res = []
    function post(root) 
        if(!root) return
        let n = root.val
        post(root.left)
        post(root.right)
        res.push(n)
    
    post(root)
    return res
;
  • 迭代
var postorderTraversal = function(root) 
    // 迭代 
    let res = []
    // 后序是左右根--反过来是根右左--为了让右先出栈,先将左压入栈再压右
    let stack = [root]
    while(stack.length !== 0) 
        let n = stack.pop()
        // n为null的情况
        if(n) 
            res.push(n.val)
            stack.push(n.left)
            stack.push(n.right)
        
    
    // 最后反转
    return res.reverse()
;

层序遍历

var levelOrder = function(root) 
    if(!root) return []
    let res = []
    // 队列 先进先出
    let queue = [root]
    while(queue.length) 
        // 定义循环次数 每一层的个数
        let len = queue.length
        // 保存当前层
        let cur = []
        for(let i=0;i<len;i++) 
            let node = queue.shift()
            cur.push(node.val)
            // 将左右子树入队
            node.left && queue.push(node.left)
            node.right && queue.push(node.right)
        
        res.push(cur)
    
    return res
;

以上是关于js实现二叉树遍历的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode二叉树实现

二叉树先序遍历C语言实现

二叉树前序中序和后序遍历的非递归实现

JavaScript实现二叉树算法

二叉树中序遍历(递归和非递归)算法C语言实现

重建二叉树(基于js)