LeetCode第226题,翻转二叉树,我们使用Typescript来完成。算法的部分很容易理解,我们在树中遍历每个节点,然后对每个节点的子节点作左右掉换。实现起来代码是
function invertTree(root: TreeNode | null): TreeNode | null {
// 如果这个节点以及不存在了就直接结束
if (!root) {
return null;
}
// 因为子节点可能是TreeNode, 也可以是null, 因此我们需要用到联合类型
const tempNode: TreeNode | null = root.left || null;
// 掉换子节点
root.left = root.right || null;
root.right = tempNode;
// 处理下一级
invertTree(root.left);
invertTree(root.right);
return root;
}
其中TreeNode的部分,LeetCode的题目以及给出
class TreeNode {
val: number
left: TreeNode | null
right: TreeNode | null
constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
this.val = (val===undefined ? 0 : val)
this.left = (left===undefined ? null : left)
this.right = (right===undefined ? null : right)
}
}
关于TS的部分,有是3个知识点可以了解一下
联合类型 Union Types
在Typescript当中,如果一个值可能是多种类型当中的某一个,而我们在声明的时候又不确定到时候是哪一种,又不想使用any,这个时候就需要使用到联合类型。在复杂场景下,联合类型可以发挥更大的作用。比如说我们想做一个权限管理的功能,这个时候我们有两种权限角色,一个是只有浏览权限的普通用户User,另一个是有修改权限的管理员Admin,但是我们在新建一个成员member的时候的时候,不确定是其中哪一种,那么我们就可以利用联合类型来帮助我们了
class User {
private name: string;
private viewAccess: boolean;
private editAccess: boolean;
construstor(name: string){
this.name = name;
this.viewAccess = true;
this.editAccess = false;
}
}
class Admin {
private name: string;
private viewAccess: boolean;
private editAccess: boolean;
construstor(name: string){
this.name = name;
this.viewAccess = true;
this.editAccess = true;
}
}
let member: User | Admin | null;
非必选
在上面TreeNode的class声明的时候,可以看到constructor的三个参数都带了“问号”, 这就是说这个值可传可不传。由于Typescript在类型检查上比较严格,如果不确定有没有这个值的时候就需要让变量作为非必选的存在,否则会编译报错