题目考察的知识点
- 树的遍历:题目要求比较两棵树的叶值序列,这涉及到对树的遍历操作。本题解析使用了深度优先搜索(DFS)进行树的遍历。
- 逆序比较:题目要求判断两棵树的叶值序列是否逆序,即第一棵树的叶子顺序是否与第二棵树的叶子逆序相同。
- 函数的定义和调用:解析代码中定义了一个函数
leafSimilar
,通过传入两棵树的根节点,判断它们的叶子节点是否逆序。
题目解答方法的文字分析
题目要求判断两棵树的叶子节点是否逆序,可以通过深度优先搜索遍历树的叶子节点,并将叶子节点的值存入序列中。然后对比两个序列是否相同或者逆序。
本题解析中,通过定义了一个辅助函数 getLeafSequence
,通过递归进行深度优先搜索,将叶子节点的值放入序列中。然后比较两个序列的长度是否相同,再逐个对比对应位置上的叶子节点的值。
本题解析所用的编程语言
本题解析所使用的编程语言是 JavaScript。
完整且正确的编程代码
在函数中,我们定义了一个辅助函数 getLeafSequence 来进行深度优先搜索。这个函数会遍历给定树的叶子节点,并将叶值添加到指定的序列中。
然后,我们通过调用 getLeafSequence 函数来获取两棵树的叶值序列 sequence1 和 sequence2。
最后,我们比较两个叶值序列的长度是否相等,以及对应位置上的叶值是否一一对应。如果长度不相等或者存在不匹配的叶值,说明叶子节点的顺序不是逆序,返回 false;否则,返回 true。
function leafSimilar(root1, root2) {
// 辅助函数:深度优先搜索遍历叶子节点,返回叶值序列
function getLeafSequence(root, sequence) {
if (root === null) return;
// 如果是叶子节点,则将叶值添加到序列中
if (root.left === null && root.right === null) {
sequence.push(root.val);
}
getLeafSequence(root.left, sequence);
getLeafSequence(root.right, sequence);
}
// 初始化两棵树的叶值序列
const sequence1 = [];
const sequence2 = [];
// 获取第一棵树的叶值序列
getLeafSequence(root1, sequence1);
// 获取第二棵树的叶值序列
getLeafSequence(root2, sequence2);
// 比较两个叶值序列是否相同
if (sequence1.length !== sequence2.length) {
return false;
}
for (let i = 0; i < sequence1.length; i++) {
if (sequence1[i] !== sequence2[sequence2.length - 1 - i]) {
return false;
}
}
return true;
}