Js实现二叉树的递归遍历和迭代遍历

目录

一、前序遍历

(1)递归实现

(2)迭代实现

二、中序遍历  

(1)递归实现

(2) 迭代实现

三、后序遍历

(1)递归实现

(2)迭代实现

四、层次遍历


一、前序遍历

对应144.二叉树的前序遍历

(1)递归实现

首先我们需要了解什么是二叉树的前序遍历:按照访问根节点——左子树——右子树的方式遍历这棵树,而在访问左子树或者右子树的时候,我们按照同样的方式遍历,直到遍历完整棵树。因此整个遍历过程天然具有递归的性质,我们可以直接用递归函数来模拟这一过程。

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var preorderTraversal = function(root) {
    let result=[]
    const dfs=function(root){
        if(root===null) return;
        result.push(root.val)
        dfs(root.left)
        dfs(root.right)
    }
    dfs(root)
    return result
};

(2)迭代实现

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var preorderTraversal = function(root) {
   if(!root) return []
   let res=[],stack=[]
   stack.push(root)
   while(stack.length){
       const cur=stack.pop()
       res.push(cur.val)
        //栈的特性先进后出,所
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉树是一种常见的数据结构,用于在计算机科学和编程中表示树形结构。在二叉树中,每个节点至多有两个子节点,分别称为左子树和右子树。二叉树遍历是指按照某种顺序依次访问二叉树中的所有节点。二叉树遍历分为三种方式:前序遍历、中序遍历和后序遍历递归和非递归遍历都是二叉树遍历的常见方式。本文将介绍在进行二叉树递归和非递归遍历时需要注意的事项及解决方案。 一、二叉树递归遍历需要注意的事项及解决方案 1.堆栈溢出问题 在进行二叉树递归遍历时,由于每个节点都需要递归遍历其左右子树,如果二叉树的深度过大,就可能造成堆栈溢出。解决这个问题的方法是使用尾递归和循环遍历。 尾递归是指递归函数中最后一步是调用自身,并且返回值不包含表达式。使用尾递归可以减少递归调用的层数,从而避免堆栈溢出。例如,以下是前序遍历的尾递归实现方式: ```python def preorder(root): if not root: return print(root.val) preorder(root.left) preorder(root.right) ``` 循环遍历的方式是将递归的过程转化为循环的过程。例如,以下是前序遍历的循环实现方式: ```python def preorder(root): if not root: return stack = [root] while stack: node = stack.pop() print(node.val) if node.right: stack.append(node.right) if node.left: stack.append(node.left) ``` 2.空节点问题 在进行二叉树递归遍历时,如果遇到空节点,需要特殊处理,否则会出现异常。解决这个问题的方法是在递归函数中添加判断空节点的代码。 例如,以下是前序遍历中空节点的处理方式: ```python def preorder(root): if not root: return print(root.val) if root.left: preorder(root.left) if root.right: preorder(root.right) ``` 二、二叉树递归遍历需要注意的事项及解决方案 1.堆栈溢出问题 在进行二叉树递归遍历时,也会遇到堆栈溢出的问题。解决这个问题的方法是使用迭代遍历和Morris遍历迭代遍历的方式是使用堆栈模拟递归的过程,具体实现方式与循环遍历类似。例如,以下是前序遍历迭代实现方式: ```python def preorder(root): if not root: return stack = [root] while stack: node = stack.pop() print(node.val) if node.right: stack.append(node.right) if node.left: stack.append(node.left) ``` Morris遍历的方式是使用线索二叉树的思想,通过修改二叉树的指针来避免使用堆栈。Morris遍历可以在不占用额外空间的情况下完成二叉树遍历。例如,以下是前序遍历的Morris实现方式: ```python def preorder(root): cur = root while cur: if not cur.left: print(cur.val) cur = cur.right else: pre = cur.left while pre.right and pre.right != cur: pre = pre.right if not pre.right: print(cur.val) pre.right = cur cur = cur.left else: pre.right = None cur = cur.right ``` 2.空节点问题 在进行二叉树递归遍历时,也需要特殊处理空节点,否则会出现异常。解决这个问题的方法是在循环中添加判断空节点的代码。 例如,以下是前序遍历中空节点的处理方式: ```python def preorder(root): if not root: return stack = [root] while stack: node = stack.pop() if not node: continue print(node.val) stack.append(node.right) stack.append(node.left) ``` 总之,二叉树遍历是编程中的重要问题之一。在进行二叉树递归和非递归遍历时,需要注意堆栈溢出和空节点的问题,并根据实际情况选择合适的解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值