二叉树的前序、中序、后序、层序的遍历
- 前序遍历: 先遍历根节点,左子树节点,最后遍历右子树节点
- 中序遍历: 先遍历左子树节点,根节点,最后遍历右子树节点
- 后序遍历: 先遍历左子树节点,右子树节点,最后遍历根节点
- 层序遍历: 按照书的深度一层一层遍历
前序遍历
迭代解法
var preorderTraversal = function(root) {
var result = []
var stack = []
if(root){
stack.push(root)
}
while(stack.length > 0){
let cutNode = stack.pop()
result.push(cutNode.val)
if(cutNode.right != null){
stack.push(cutNode.right)
}
if(cutNode.left != null){
stack.push(cutNode.left)
}
}
return result
}
递归解法
var preorderTraversal = function(root) {
var result = []
if(root == null) return result
var travel = function(node){
if(node){
result.push(node.val)
travel(node.left)
travel(node.right)
}
}
travel(root)
return result
};
中旬遍历
递归解法
var inorderTraversal = function(root) {
var result = []
if(root == null) return result
var travel = function(node){
if(node){
travel(node.left)
result.push(node.val)
travel(node.right)
}
}
travel(root)
return result
}
迭代解法
var inorderTraversal = function(root) {
var result = []
var stack = []
var node = null
if(root == null) return result
node = root
while(node || stack.length){
while(node){
stack.push(node)
node = node.left
}
let popNode = stack.pop()
result.push(popNode.val)
node = popNode.right
}
return result
}
后序遍历
递归解法
var postorderTraversal = function(root) {
var result = []
if(root){
var travel = function(node){
if(node){
travel(node.left)
travel(node.right)
result.push(node.val)
}
}
travel(root)
}
return result
};
迭代解法
var postorderTraversal = function(root) {
var result = []
var stack = []
if(root){
stack.push(root)
while(stack.length > 0){
let curNode = stack.pop()
result.unshift(curNode.val)
if(curNode.left != null){
stack.push(curNode.left)
}
if(curNode.right != null){
stack.push(curNode.right)
}
}
}
return result
};
层序遍历
递归解法
var levelOrder = function(root) {
if(root == null) return []
var res = []
travel(root, 0, res)
return res
};
function travel(root, index, res){
if(root){
if(!res[index]) res[index] = []
res[index].push(root.val)
travel(root.left, index + 1, res)
travel(root.right, index + 1, res)
}
}
迭代解法
var levelOrder = function(root) {
var result = []
var queue = []
if(root == null) return []
queue.push(root, null)
var level = []
while(queue.length > 0){
let node = queue.shift()
if(node){
level.push(node.val)
if(node.left){
queue.push(node.left)
}
if(node.right){
queue.push(node.right)
}
}else{
if(queue.length > 0) queue.push(null)
result.push(level)
level = []
}
}
return result
};