构造一个二叉树:
class Tree{
constructor(node){
this.node = node;
this.left = null;
this.right = null;
}
}
1. 前序遍历
前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。
preOrder(callback){ // 前序遍历
callback(this.value);
if(this.left !== null){
this.left.preOrder(callback);
}
if(this.right !== null){
this.right.preOrder(callback);
}
}
2. 中序遍历
中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。
centerOrder(callback){
if(this.left !== null){
this.left.preOrder(callback);
}
callback(this.value);
if(this.right !== null){
this.right.preOrder(callback);
}
}
3. 后序遍历
后序遍历首先遍历左子树,然后遍历右子树,最后访问根结点。
endOrder(callback){
if(this.left !== null){
this.left.preOrder(callback);
}
if(this.right !== null){
this.right.preOrder(callback);
}
callback(this.value);
}
4. 层次遍历
层次遍历会一层一层的遍历树,遍历每一层的根节点,最后遍历所有叶子节点。
思路是先将根元素放入一个队列里,循环直到队列为空,每次循环就出队,然后再把根节点的左子节点和右子节点放入队列中。代码如下:
levelTraversal(root, callback) {
let queue = [root];
while(queue.length) {
let node = queue.shift();
callback(node.value);
let leftNode = node.left,
rightNode = node.right;
if(leftNode) queue.push(leftNode);
if(rightNode) queue.push(rightNode);
}
}