最近在刷力扣的二叉树方向的专题训练,由于力扣官网的测试用例是内部封装好了将输入的列表转换为了对应的树结构,但是对于本地调试来说,就很难受。看了一圈好像没有TS练习二叉树的专门的模板,因此写了一个二叉树刷题的本地调试模板。
//创建树节点
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)
}
}
//创建二叉树结构
class BinaryTree {
createTree(nodeList: (number | null)[]): TreeNode | null {
if (nodeList.length === 0 || nodeList[0] === null) return null;
const queue: TreeNode[] = [];
const root = new TreeNode(nodeList[0]!);
queue.push(root);
let index = 0;
while (queue.length > 0) {
const cur: TreeNode[] = [];
while (queue.length > 0) {
const node = queue.shift()!;
let left: TreeNode | null = null;
let right: TreeNode | null = null;
if (++index < nodeList.length && nodeList[index] !== null) {
left = new TreeNode(nodeList[index]!);
cur.push(left);
}
if (++index < nodeList.length && nodeList[index] !== null) {
right = new TreeNode(nodeList[index]!);
cur.push(right);
}
node.left = left;
node.right = right;
}
queue.push(...cur);
}
return root;
}
}
// 示例用法
const arr: (number | null)[] = [3, 5, 1, 6, 2, 9, 8, null, null, 7, 4];
const tree = new BinaryTree().createTree(arr);
下面以力扣第100题 相同的树 为例 演示本地调试使用方法
[100.相同的树]leetcode.cn/problems/sa…
//创建树节点
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)
}
}
//创建二叉树结构
class BinaryTree {
createTree(nodeList: (number | null)[]): TreeNode | null {
if (nodeList.length === 0 || nodeList[0] === null) return null;
const queue: TreeNode[] = [];
const root = new TreeNode(nodeList[0]!);
queue.push(root);
let index = 0;
while (queue.length > 0) {
const cur: TreeNode[] = [];
while (queue.length > 0) {
const node = queue.shift()!;
let left: TreeNode | null = null;
let right: TreeNode | null = null;
if (++index < nodeList.length && nodeList[index] !== null) {
left = new TreeNode(nodeList[index]!);
cur.push(left);
}
if (++index < nodeList.length && nodeList[index] !== null) {
right = new TreeNode(nodeList[index]!);
cur.push(right);
}
node.left = left;
node.right = right;
}
queue.push(...cur);
}
return root;
}
}
//题目代码插到此处👇
function isSameTree(p: TreeNode | null, q: TreeNode | null): boolean {
//判断两棵树是否都为空
if (p === null && q === null) return true;
//判断其中一棵树为空
if (p === null || q === null) return false;
//判断当前根节点是否相同
if (p.val !== q.val) return false;
//递归判断左右子树是否相同
return isSameTree(p?.left, q?.left) && isSameTree(p?.right, q?.right) && p?.val === q?.val;
};
/**
输入: p = [1,2,3], q = [1,2,3]
输出: true
*/
//将官网的测试用例输入转换为如下格式:
const p = [1,2,3],q =[1,2,3];
const treeP = new BinaryTree().createTree(p);
const treeQ = new BinaryTree().createTree(q);
//本地调试结果
console.log(isSameTree(treeP,treeQ) //true
后续会继续在这篇文章下更新我的二叉树刷题题单。