用JavaScript实现树的遍历

本文详细介绍了如何通过递归和迭代方式实现二叉树的前序、中序和后序遍历,并提供了JavaScript代码示例。通过实例展示了前序遍历为1,2,4,5,3,6,7;中序遍历为4,2,5,1,6,3,7;后序遍历为4,5,2,6,7,3,1。
摘要由CSDN通过智能技术生成

每种遍历都通过递归和迭代两种方法实现

前序遍历代码

function TreeNode(val, left, right) {
  this.val = (val === undefined ? 0 : val);
  this.left = (left === undefined ? null : left);
  this.right = (right === undefined ? null : right);
}

let root_1_4 = new TreeNode(4);
let root_1_5 = new TreeNode(5);
let root_1_6 = new TreeNode(6);
let root_1_7 = new TreeNode(7);
let root_1_2 = new TreeNode(2, root_1_4, root_1_5);
let root_1_3 = new TreeNode(3, root_1_6, root_1_7);
let root_1_1 = new TreeNode(1, root_1_2, root_1_3);

var preorderTraversal_1 = function (root) {
  // 递归法
  let result = [];
  if (!root) {
    return result;
  }
  const order = (root) => {
    result.push(root.val);
    if (root.left !== null) {
      order(root.left);
    }
    if (root.right !== null) {
      order(root.right);
    }
  }
  order(root);
  return result;
};

var preorderTraversal_2 = function (root) {
  // 迭代法
  let result = [];
  if (!root) {
    return result;
  }
  // 设立一个栈
  let stack = [];
  stack.push(root);
  while (stack.length) {
    let current = stack.pop();
    result.push(current.val);
    // 因为 stack 先进后出的原则,所以应该先放右边的值再放左边的值
    if (current.right) {
      stack.push(current.right);
    }
    if (current.left) {
      stack.push(current.left);
    }
  }
  return result;
};
console.log("前序遍历");
console.log("正确结果: 1, 2, 4, 5, 3, 6, 7");
console.log("递归法:" + preorderTraversal_1(root_1_1));
console.log("迭代法:" + preorderTraversal_2(root_1_1));

中序遍历代码

function TreeNode(val, left, right) {
  this.val = (val === undefined ? 0 : val);
  this.left = (left === undefined ? null : left);
  this.right = (right === undefined ? null : right);
}

let root_2_4 = new TreeNode(4);
let root_2_5 = new TreeNode(5);
let root_2_6 = new TreeNode(6);
let root_2_7 = new TreeNode(7);
let root_2_2 = new TreeNode(2, root_2_4, root_2_5);
let root_2_3 = new TreeNode(3, root_2_6, root_2_7);
let root_2_1 = new TreeNode(1, root_2_2, root_2_3);

var inorderTraversal_1 = function (root) {
  // 递归法
  let result = [];
  if (!root) {
    return [];
  }
  const order = (root) => {
    if (root.left) {
      order(root.left);
    }
    result.push(root.val);
    if (root.right) {
      order(root.right);
    }
  }
  order(root);
  return result;
};

var inorderTraversal_2 = function (root) {
  // 递归法
  let result = [];
  if (!root) {
    return [];
  }
  let stack = [];
  let temp = root;
  // 先对左子树进行展开
  while (temp) {
    stack.push(temp);
    temp = temp.left;
  }
  while (stack.length) {
    let current = stack.pop();
    result.push(current.val);
    // 如果这个节点还有右子树
    if (current.right) {
      let temp2 = current.right;
      while (temp2) {
        stack.push(temp2);
        temp2 = temp2.left;
      }
    }
  }
  return result;
};
console.log("中序遍历");
console.log("正确结果: 4, 2, 5, 1, 6, 3, 7");
console.log("递归法:" + inorderTraversal_1(root_2_1));
console.log("递归法:" + inorderTraversal_2(root_2_1));

后序遍历代码

function TreeNode(val, left, right) {
  this.val = (val === undefined ? 0 : val);
  this.left = (left === undefined ? null : left);
  this.right = (right === undefined ? null : right);
}

let root_3_4 = new TreeNode(4);
let root_3_5 = new TreeNode(5);
let root_3_6 = new TreeNode(6);
let root_3_7 = new TreeNode(7);
let root_3_2 = new TreeNode(2, root_3_4, root_3_5);
let root_3_3 = new TreeNode(3, root_3_6, root_3_7);
let root_3_1 = new TreeNode(1, root_3_2, root_3_3);

var postorderTraversal_1 = function (root) {
  // 递归法
  let result = [];
  if (!root) {
    return result;
  }
  const order = (root) => {
    if (root.left) {
      order(root.left);
    }
    if (root.right) {
      order(root.right);
    }
    result.push(root.val);
  }
  order(root);
  return result;
};

var postorderTraversal_2 = function (root) {
  // 迭代法
  let result = [];
  if (!root) {
    return result;
  }
  let stack = [];
  let temp = root;
  // 先把左边全部展开
  while (temp) {
    stack.push(temp);
    temp = temp.left;
  }
  let current = null;
  while (stack.length) {
    let top = stack[stack.length - 1];
    if (!top.right || (top.right && current === top.right)) {
      current = stack.pop();
      result.push(top.val);
    } else {
      // 如果 top.right 不等于 null
      let temp2 = top.right;
      while (temp2) {
        stack.push(temp2);
        temp2 = temp2.left;
      }
    }
  }
  return result;
};

console.log("后序遍历");
console.log("正确结果: 4, 5, 2, 6, 7, 3, 1");
console.log("递归法:" + postorderTraversal_1(root_3_1));
console.log("递归法:" + postorderTraversal_2(root_3_1));

实现页面

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>前序中序后序</title>
</head>
<body>
  
</body>
</html>

<script src = "前序.js"></script>
<script src = "中序.js"></script>
<script src = "后序.js"></script>

最后结果展示

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值