01.填充每个节点的下一个右侧节点指针
思路:使用层序遍历。由题可知,需要将指针指向下一个结点。所以我们可以记录当前结点的前结点,并将前结点指向当前结点即可。需要注意的是,在添加子节点的时候,添加前结点的子节点。
function connect(root: Node | null): Node | null {
const queue:Node[] = []
let preNode:Node
let curNode:Node
if (root) queue.push(root)
while (queue.length > 0) {
for (let i = 0, len = queue.length; i < len; i++) {
if (i == 0) {
preNode = queue.shift()
} else {
curNode = queue.shift()
preNode.next = curNode
preNode = curNode
}
if (preNode.left) queue.push(preNode.left)
if (preNode.right) queue.push(preNode.right)
}
}
return root
};
02.二叉树的最小深度
思路:层序遍历,每遍历一遍就相当于树的深度加一。只有当没有左右孩子的时候才是最低深度
function minDepth(root: TreeNode | null): number {
const queue:TreeNode[] = []
let ans:number = 0
if (root) queue.push(root)
while (queue.length > 0) {
ans++
for (let i = 0, len = queue.length; i < len; i++) {
let cur = queue.shift()
if (!cur.left && !cur.right) return ans
if (cur.left) queue.push(cur.left)
if (cur.right) queue.push(cur.right)
}
}
return ans
};
03.翻转二叉树
思路:遍历二叉树,每个结点的左右结点互换
function invertTree(root: TreeNode | null): TreeNode | null {
const queue:TreeNode[] = []
let tmpArr = []
if (root) queue.push(root)
while (queue.length > 0) {
for (let i = 0, len = queue.length; i < len; i++) {
let cur = queue.shift()
let tmpNode = cur.left
cur.left = cur.right
cur.right = tmpNode
if (cur.left) queue.push(cur.left)
if (cur.right) queue.push(cur.right)
}
}
return root
};