class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root == NULL || root == p || root == q) return root;
TreeNode* left = lowestCommonAncestor(root->left, p, q);
TreeNode* right = lowestCommonAncestor(root->right, p, q);
if(left == NULL) return right;
if(right == NULL) return left;
return root;
}
};
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
while(root != NULL) {
if(root->val < p->val && root->val < q->val) {
root = root->right;
}
else if(root->val > p->val && root->val > q->val) {
root = root->left;
}
else break;
}
return root;
}
};
class Solution {
public:
TreeNode* head = new TreeNode(-1), *cur = head;
void inOrder(TreeNode* node) {
if(node == NULL) return;
inOrder(node->left);
node->left = NULL;
cur->right = node;
cur = node;
inOrder(node->right);
}
TreeNode* convertBiNode(TreeNode* root) {
inOrder(root);
return head->right;
}
};
class Solution {
public:
int res = 0;
int pathSum(TreeNode* root, int sum) {
if(root == NULL) return 0;
dfs(root, sum);
pathSum(root->left, sum);
pathSum(root->right, sum);
return res;
}
void dfs(TreeNode* root, int sum) {
if(root == NULL) return;
if(sum - root->val == 0) res ++;
dfs(root->left, sum - root->val);
dfs(root->right, sum - root->val);
}
};
class Solution {
public:
bool checkSubTree(TreeNode* t1, TreeNode* t2) {
if(t2 == NULL) return true;
if(t2 != NULL && t1 == NULL) return false;
if(t1->val != t2->val) {
return checkSubTree(t1->left, t2) || checkSubTree(t1->right, t2);
}
return checkSubTree(t1->left, t2->left) && checkSubTree(t1->right, t2->right);
}
};