通过算法入门Typescript(2)翻转二叉树

139 阅读2分钟

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在类型检查上比较严格,如果不确定有没有这个值的时候就需要让变量作为非必选的存在,否则会编译报错