上篇文件已经讲解了什么是二叉树?二叉树的特点!今天我们要说下二叉树的几种常见的遍历!话不多说,直接进入正题!以下图为例子!
一.前序遍历
所谓前序,是指得根结点靠前,然后在是左节点,再右节点! 根结点 → \rightarrow →左节点 → \rightarrow →右节点,看图1的二叉树,前序排序的顺序为 1 → \rightarrow → 2 → \rightarrow → 4 → \rightarrow → 3 → \rightarrow → 6 → \rightarrow → 7,那么我们应该怎么实现呢?实现的方式有几种?
1.递归遍历
这种方法就比较简单了!不断的重复遍历!我们先模拟个图1的数据
let node = {
"val": 1,
"left": {
"val": 2,
"left": {
"val": 4
}
},
"right": {
"val": 3,
"left": {
"val": 6
},
"right": {
"val": 7
}
}
};
let preorderTraversal = (root) => {
let arr = [];
let map = (root) => {
if (root) {
arr.push(root.val);
map(root.left);
map(root.right);
}
}
map(root);
return arr;
};
console.log(preorderTraversal(node)); // [1, 2, 4, 3, 6, 7]
2.利用栈的思想(后进先出)
let preorderTraversal = (root) => {
let stack = [];//栈的长度
let arr = [];
stack.push(root);
while (stack.length > 0) {
let node = stack.pop();
if (node) {
arr.push(node.val);
if (node.right) stack.push(node.right);//先放右结点
if (node.left) stack.push(node.left);//再放左节点
};
};
return arr;
};
console.log(preorderTraversal(node));// [1, 2, 4, 3, 6, 7]
二.中序遍历
所谓中序,是指得根结点在中间,先是左节点,再根结点在中间,然后再右节点! 左结点 → \rightarrow →根节点 → \rightarrow →右节点,看图1的二叉树,中序排序的顺序为4 → \rightarrow → 2 → \rightarrow → 1 → \rightarrow → 6 → \rightarrow → 3 → \rightarrow → 7,下面我们还是来两种方式来实现!
1.递归遍历
我们还是先模拟个图1的数据
let node = {
"val": 1,
"left": {
"val": 2,
"left": {
"val": 4
}
},
"right": {
"val": 3,
"left": {
"val": 6
},
"right": {
"val": 7
}
}
};
let inorderTraversal = (root) => {
var arr = [];
let map = (root) => {
if (root) {
map(root.left);
arr.push(root.val);
map(root.right);
};
};
map(root);
return arr;
};
console.log(inorderTraversal(node));//[4, 2, 1, 6, 3, 7]
2.利用栈的思想(后进先出)
let inorderTraversal = (root) => {
let arr = [];
let stack = [];//栈的长度
while (root || stack.length > 0) {
while (root) {
stack.push(root);
root = root.left;
};//先遍历出所有左节点
let list = stack.pop();//取栈的最后一个
arr.push(list.val);
root = list.right;//右节点有值再遍历右节点
}
return arr;
};
console.log(inorderTraversal(node));//[4, 2, 1, 6, 3, 7]
三.后序遍历
所谓后序,是指得根结点在最后,先是左节点,再右结点,然后再根节点! 左结点 → \rightarrow →右节点 → \rightarrow →根节点,看图1的二叉树,后序排序的顺序为4 → \rightarrow → 2 → \rightarrow → 6 → \rightarrow → 7 → \rightarrow → 3 → \rightarrow → 1,下面我们还是来两种方式来实现!
1.递归遍历
还是以上面的数据为例子!
let node = {
"val": 1,
"left": {
"val": 2,
"left": {
"val": 4
}
},
"right": {
"val": 3,
"left": {
"val": 6
},
"right": {
"val": 7
}
}
};
let postorderTraversal = (root) => {
let arr = [];
let map = (root) => {
if (root) {
map(root.left);
map(root.right);
arr.push(root.val);
}
}
map(root);
return arr;
};
console.log(postorderTraversal(node)); // [4, 2, 6, 7, 3, 1]
2.利用栈的思想(后进先出)
let postorderTraversal = (root) => {
let arr = [];
let stack = [];
// 当根节点不为空的时候,将根节点入栈
if (root) stack.push(root)
while (stack.length > 0) {
let node = stack.pop()
arr.unshift(node.val);
if (node.left) {
stack.push(node.left)
};
if (node.right) {
stack.push(node.right)
};
}
return arr
};
console.log(postorderTraversal(node));// [4, 2, 6, 7, 3, 1]
四.总结
所谓前序中序后续遍历,都是相对根结点来说的,左右结点的顺序一定是先左后右的,记住这点,你就不会把顺序搞错了!实现的方式有很多种,可以用递归,递归比较容易理解,当然也可以尝试用队列和栈的思想去模拟实现!