题目地址:
给定一棵二叉树,再给定一个数组 A A A,问是否存在一条从树根到叶子的路径,使得路径上的值恰好就是序列 A A A。题目保证 A A A非空。
思路是DFS。DFS的同时用一个变量记录遍历到了 A A A的哪个位置。代码如下:
public class Solution {
public boolean isValidSequence(TreeNode root, int[] arr) {
return dfs(0, root, arr);
}
private boolean dfs(int pos, TreeNode cur, int[] A) {
// 走到了null则直接返回false
if (cur == null) {
return false;
}
// cur不是null,但A已经走完了,说明A长度不够,返回false
if (pos == A.length) {
return false;
}
// 值不相等,返回false
if (cur.val != A[pos]) {
return false;
}
// 值相等,又是叶子,只需看一下当前数是否是A最后一个数,是则返回true,否则false
if (cur.left == null && cur.right == null) {
return pos == A.length - 1;
}
return dfs(pos + 1, cur.left, A) || dfs(pos + 1, cur.right, A);
}
}
class TreeNode {
int val;
TreeNode left, right;
public TreeNode(int val) {
this.val = val;
}
}
时间复杂度 O ( n ) O(n) O(n),这里的 n n n指的是二叉树深度小于等于 A A A的长度的节点总数(因为深度大于 A A A长度的节点事实上都不会被访问),空间 O ( min { h , l A } ) O(\min\{h, l_A\}) O(min{h,lA})。