javascript实现二叉树递归遍历和非递归遍历

2018-03-16  本文已影响0人  _shen

首先我们实现二叉树的构造

(function () {

  /**
   * 首先我们定义一个Node的构造函数
   */
  function Node(data) {
    this.left = null;
    this.right = null;
    this.data = data;
  }

  /**
   * 二叉树的创建
   * 我们规定用数字0表示为空节点
   */
  function createTree (data) {
    let dat = data.shift();
    let p = null;

    if (dat != 0) {
      p = new Node(dat);
      p.left = createTree(data);
      p.right = createTree(data);
    }

    return p;
  }

// 构造一棵二叉树
let arr = [1,2,4,0,0,5,0,0,3,6,0,0,7,0,0],
    root = createTree(arr);

})();

递归遍历

// 前序遍历
function prevTraverse (node) {
  if (node === null) return;

  prevTraverse(node.left);
  console.log(node.data);
  prevTraverse(node.right);
}

// 中序遍历
function middleTraverse (node) {
  if (node === null) return;

  console.log(node.data);
  middleTraverse(node.left);
  middleTraverse(node.right);
}

// 后序遍历
function lastTraverse (node) {
  if (node === null) return;

  lastTraverse(node.left);
  lastTraverse(node.right);
  console.log(node.data);
}

非递归遍历

非递归前序遍历

function prevTraverseUnRecursion (root) {
  let arr = [],
      node = null;

  arr.unshift(root);

  while (arr.length !== 0) {
    node = arr.shift();
    console.log(node.data);

    if (node.right !== null) {
      arr.unshift(node.right);
    }

    if (node.left !== null) {
      arr.unshift(node.left);
    }
  }
}

非递归中序遍历

function middleTraverseUnRecursion (root) {
  let arr = [],
      node = root;

  while (arr.length !== 0 || node !== null) {
    if (node === null) {
      node = arr.shift();
      console.log(node.data);
      node = node.right;
    } else {
      arr.unshift(node);
      node = node.left;
    }
  }

}

非递归后序遍历

function lastTraverseUnRecursion (root) {
  let arr = [],
      parentNode = null,
      traverseNode = null;

  if (root !== null) {
    arr.unshift(root);

    while (arr.length !==0) {
      parentNode = arr[0];
      if (parentNode.left !== null && traverseNode !== parentNode.left &&traverseNode !== parentNode.right) {
        arr.unshift(parentNode.left);
      } else if (parentNode.right !== null && traverseNode !== parentNode.right) {
        arr.unshift(parentNode.right);
      } else {
        traverseNode = arr.shift();
        console.log(traverseNode.data);
      }
    }
  }
}
上一篇 下一篇

猜你喜欢

热点阅读