Я искал первое рекурсивное решение для этой проблемы в Leetcode.Вот код для предложенного решения.
public boolean isSymmetric(TreeNode root) {
return isMirror(root, root);
}
public boolean isMirror(TreeNode t1, TreeNode t2) {
if (t1 == null && t2 == null) return true;
if (t1 == null || t2 == null) return false;
return (t1.val == t2.val)
&& isMirror(t1.right, t2.left)
&& isMirror(t1.left, t2.right);
}
Часть решения, которую я не понимаю, - это то, почему автор решения говорит, что сложность времени равна O (n).Допустим, у меня был ввод:
1
/ \
2 2
Вот как я отслеживаю стек вызовов в этом случае:
isMirror(1, 1)
(t1.val == t2.val) returns true
isMirror(2, 2) returns true
(t1.val == t2.val) returns true
isMirror(null, null) return true
isMirror(null, null) return true
isMirror(2, 2) returns true
(t1.val == t2.val) returns true
isMirror(null, null) return true
isMirror(null, null) return true
В приведенном выше стеке вызовов isMirror () вызывается 7 разв то время как n равно 3. Чтобы временная сложность была O (n), должен ли isMirror () вызываться только 3 раза?Или я смотрю на это неправильно?Является ли тот факт, что стек вызовов прошел только на 3 уровня, показывает, что сложность времени составляет O (n)?
Спасибо за помощь.