三种遍历方式在同一种递归思想的实现
每次迭代其实中间会有一个暂存stack(维护先进先出的原则),暂时保存每次向左或者向右的遍历结果,等到全遍历完,再把结果push,按照结果
先序遍历(PreOrder, 按照先访问根节点的顺序)
var preorderTraversal = function(root) {
const res = []
function traversal (root) {
if (root !== null) {
// 实际访问顺序,一直先遍历左子树,但是先把根节点的值push进去了,之后再把左节点的值push进去
// 这个顺序就是按照start 的流线走的
res.push(root.val) // 访问根节点的值
traversal(root.left) // 递归遍历左子树
traversal(root.right) // 递归遍历右子树
}
}
traversal(root)
return res
}
中序遍历(InOrder, 按照根节点在中间访问的顺序)
var inorderTraversal = function(root) {
const res = []
function traversal (root) {
if (root !== null) {
// 实际访问顺序,一直先遍历左子树,但是这里中序遍历是先把左子树的值push进去了,之后再把根节点的值push进去 // 这个顺序就是按照start 的流线走的
traversal(root.left) // 递归遍历左子树
res.push(root.val) // 访问根节点的值
traversal(root.right) // 递归遍历右子树
}
}
traversal(root)
return res
}
后序遍历(PosterOrder, 按照根节点在后面访问的顺序)
var postorderTraversal = function(root) {
const res = []
function traversal (root) {
if (root !== null) {
traversal(root.left) // 递归遍历左子树
traversal(root.right) // 递归遍历右子树
res.push(root.val) // 访问根节点的值
}
}
traversal(root)
return res
}