二叉树的遍历

46 阅读1分钟

二叉树总共有三种遍历方式,分别是先序遍历,中序遍历,后序遍历。

创建二叉树

function BinarySearchTree () {
function Node (key) {
    this.key = key
    this.left = null
    this.right = null
  }
  //属性 根节点
  this.root = null
  //方法
  BinarySearchTree.prototype.insert = function (key) {
    var newNode = new Node(key)
    //先判断根节点是否为空,如果根节点为空创建根节点
    if (this.root == null) {
      this.root = newNode
    } else {
      //根节点不为空 需要使用递归插入
      this.insertNode(this.root, newNode)
    }
  }
  BinarySearchTree.prototype.insertNode = function (node, newNode) {
    //向左查找
    if (newNode.key < node.key) {
      //需要判断下一个节点是否为空
      if (node.left == null) {
        node.left = newNode
      } else {
        //如果不为空继续进行递归
        this.insertNode(node.left, newNode)
      }
    } else {
      //向右查找
      if (node.right == null) {
        node.right = newNode
      } else {
        this.insertNode(node.right, newNode)
      }
    }
  }

```js

1. 先序遍历

先从 根节点->左子树->右子树

//二叉搜索树

function BinarySearchTree () {

  //二叉搜索树遍历
  //先序遍历
  BinarySearchTree.prototype.proOrder = function (handler) {
    this.proOrderNode(this.root, handler)

  }
  //先序遍历递归
  BinarySearchTree.prototype.proOrderNode = function (node, handler) {
    if (node != null) {
      //中间的值
    
      this.proOrderNode(node.left, handler)
       handler(node.key)
      this.proOrderNode(node.right, handler)
    }
  }
}

var db = new BinarySearchTree()


db.insert(11)
db.insert(7)
db.insert(5)
db.insert(3)
db.insert(6)
db.insert(9)
db.insert(8)
db.insert(10)
db.insert(15)
db.insert(13)
db.insert(12)
db.insert(14)
db.insert(20)
db.insert(18)
db.insert(25)
var str = ""
db.proOrder(function (key) {
  str += key + " "
})
console.log(str);

2.中序遍历

左节点->根节点->右节点 只需要改动一下递归里面的顺序就可以实现中序遍历

//先序遍历递归
  BinarySearchTree.prototype.proOrderNode = function (node, handler) {
    if (node != null) {
      //中间的值
    
      this.proOrderNode(node.left, handler)
       handler(node.key)
      this.proOrderNode(node.right, handler)
    }
  }

3.后序遍历

左节点->右节点->根节点 同理改变递归里面的顺序

 //先序遍历递归
  BinarySearchTree.prototype.proOrderNode = function (node, handler) {
    if (node != null) {
      //中间的值
      this.proOrderNode(node.left, handler)
      this.proOrderNode(node.right, handler)
      handler(node.key)
    }
  }

总结: