Subtree of Another Tree
判断是否存在子树
my solution
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class Solution { public: bool isSubtree(TreeNode* s, TreeNode* t) { if (!t) return !s;
return findRoot(s, t); }
bool findRoot(TreeNode *s, TreeNode *t) { if (!s) return false; if (s->val == t->val && isMatch(s, t)) return true;
return findRoot(s->left, t) || findRoot(s->right, t); }
bool isMatch(TreeNode *s, TreeNode *t) { if (!t) return !s; if (!s) return false;
if (s->val != t->val) return false;
return isMatch(s->left, t->left) && isMatch(s->right, t->right); } };
|
简单解释的话, 就是 “归归” 算法 😂. 递归套递归, 尽管我十分不情愿. 但是因为这不是个 bst 的缘故. 只有在递归中去判断(这个判断也需要递归)才比较高效, 不然如何判断”是否存在其他节点的值和这个节点相等, 也能进行判断”就会成为一个比较费力的问题. 写出 “归归” 就像🐮被挤出了最后一滴一样不情愿😭.
the best solution
1 2 3 4 5 6 7 8 9 10 11 12
| class Solution { bool eq(TreeNode* s, TreeNode* t){ if (!s && !t) return true; if (!s || !t) return false; return s->val == t->val && eq(s->left, t->left) && eq(s->right, t->right); } public: bool isSubtree(TreeNode* s, TreeNode* t) { return s && (eq(s, t) || isSubtree(s->left, t) || isSubtree(s->right, t)); } };
|
哈哈哈, 老哥你也是 “归归” 啊.
咳咳, 不过比我少了一个函数, 仔细看看.
if (!t) return !s;
if (!s) return false;
// ---------------------
if (!s && !t) return true;
if (!s || !t) return false;
就这两个表达式的处理而言, 老夫觉得自己要胜一筹! 第一个表达式就是如果 t 为假, 那么 s 为 true 则 false, 反之亦可.
而第二个表达式可以基于第一个表达式, 这时候 t 已经不可能为 false 了. 如果 s 为真, 直接返回 false 就好.