代码随想录的第十三天(二叉树)
思路:
1、层序遍历整体思路就是,模拟一个队列
2、记录队列的长度,因为后续需要对队列里面的每个值都进行遍历
3、将队列中的首个值抛出,然后去查看他有没有左右子树,有的话就塞进来,以此类推
102. 二叉树的层序遍历
var levelOrder = function(root) {
const res = []
const stack = []
if (root !== null) stack.push(root)
while (stack.length) {
let size = stack.length
const arr = []
while (size--) {
const cur = stack.shift()
arr.push(cur.val)
if (cur.left) {
stack.push(cur.left)
}
if (cur.right) {
stack.push(cur.right)
}
}
res.push(arr)
}
return res
};
107. 二叉树的层序遍历 II
var levelOrderBottom = function(root) {
const res= []
const stack = []
if (root !== null) stack.push(root)
while (stack.length) {
let size = stack.length
const arr = []
while (size--) {
const cur = stack.shift()
arr.push(cur.val)
if (cur.left) {
stack.push(cur.left)
}
if (cur.right) {
stack.push(cur.right)
}
}
res.unshift(arr)
}
return res
};
199. 二叉树的右视图
var rightSideView = function(root) {
const res = []
const stack = []
if (root !== null) stack.push(root)
while (stack.length) {
let size = stack.length
const arr = []
while (size--) {
const cur = stack.shift()
arr.push(cur.val)
if (cur.left) {
stack.push(cur.left)
}
if (cur.right) {
stack.push(cur.right)
}
}
res.push(arr[arr.length - 1])
}
return res
};
637. 二叉树的层平均值
var averageOfLevels = function(root) {
const res = []
const stack = []
if (root !== null) stack.push(root)
while (stack.length) {
let size = stack.length
let sum = 0
let len = 0
while (size--) {
const cur = stack.shift()
sum += cur.val
len++
if (cur.left) {
stack.push(cur.left)
}
if (cur.right) {
stack.push(cur.right)
}
}
res.push((sum/len).toFixed(5))
}
return res
};
429. N 叉树的层序遍历
var levelOrder = function(root) {
const res = []
const stack = []
if (root !== null) stack.push(root)
while (stack.length) {
let size = stack.length
const arr = []
while (size--) {
const cur = stack.shift()
arr.push(cur.val)
if (cur.children) {
for (let i = 0; i < cur.children.length; i++) {
stack.push(cur.children[i])
}
}
}
res.push(arr)
}
return res
};
104. 二叉树的最大深度
var maxDepth = function(root) {
const res = []
const stack = []
if (root !== null) stack.push(root)
while (stack.length) {
let size = stack.length
const arr = []
while (size--) {
const cur = stack.shift()
arr.push(cur.val)
if (cur.left) stack.push(cur.left)
if (cur.right) stack.push(cur.right)
}
res.push(arr)
}
return res.length
};
116. 填充每个节点的下一个右侧节点指针
var connect = function(root) {
if (root === null) return root
let stack = [root]
while (stack.length) {
let size = stack.length
for (let i = 0; i < size; i++) {
const cur = stack.shift()
if (i < size - 1) {
cur.next = stack[0]
}
if (cur.left) stack.push(cur.left)
if (cur.right) stack.push(cur.right)
}
}
return root
};
思路:
1、这道题思路主要在于下个节点的指针指向当前节点进行连接
-
515.在每个树行中找最大值
-
117.填充每个节点的下一个右侧节点指针II
-
111.二叉树的最小深度
还有三道需要补充
226. 翻转二叉树
var invertTree = function(root) {
const res = []
const stack = []
if (root !== null) stack.push(root)
while (stack.length) {
let size = stack.length
const arr = []
while (size--) {
const cur = stack.shift()
arr.push(cur.val)
if (cur.right) {
stack.push(cur.right)
}
if (cur.left) {
stack.push(cur.left)
}
}
res.push(arr)
}
function flat (data) {
let arr = []
for (let i = 0; i < data.length; i++) {
if (Array.isArray(data[i])) {
arr = arr.concat(flat(data[i]))
} else {
arr.push(data[i])
}
}
return arr
}
const a = flat(res)
return a
};
思路:报错了,没看出具体是哪儿的问题,需要后续再看下:指针问题
var invertTree = function(root) {
if (root === null) return null
let rightNode = root.right
root.right = invertTree(root.left)
root.left = invertTree(rightNode)
return root
};
思路:
前序遍历
var invertTree = function(root) {
if (root === null) return null
const left = invertTree(root.left)
const right = invertTree(root.right)
root.right = left
root.left = right
return root
};
思路:后序遍历
二刷补充迭代和层序遍历
101. 对称二叉树
var isSymmetric = function(root) {
function compare(left, right) {
if (left === null && right !== null){
return false
} else if (left!== null && right === null) {
return false
} else if (left === null && right === null) {
return true
} else if (left.val !== right.val) {
return false
} else if (left.val === right.val) {
const inSide = compare(left.left, right.right)
const outSide = compare(left.right, right.left)
return inSide && outSide
}
}
return compare(root.left, root.right)
};
思路:
1、这道题判断的左右子树是否可以互相翻转相同
2、同时对左右两个子树的节点进行比较
3、最后需要比较左侧子树的外侧节点和右子树的外侧节点是否相同,左子树的内侧节点和右子树的内侧节点是否相同,返回结果