BST
BST
h>
pace std;
if (!p || !q)
return false;
t = NULL;
if (p->val != q->val)
return false;
etRoot() {return root;}
return isSameTree(p->left, q->left)
isSameTree(p->right, q->right);
}
sert(int val){ };
e *x,*y,*z;
Node*)malloc(sizeof(Node));
key=val;
left=NULL; find the path with target as pathsum. WE can
right=NULL; a node end of the path if its both choldren
parent=NULL; did this way.
root==NULL) class Solution {
public:
root=z;
return; bool hasPathSum(TreeNode* root, int targ
if(root==NULL) return false;
oot; return hasPathSum2(root, targetSum);
ULL;
le(x!=NULL) }
bool hasPathSum2(TreeNode* root, int tar
if(val<x->key){ if (!root->left&&!root->right)
y=x; {
x=x->left; if(targetSum!=root->val) return
}else else return true;
{ }
y=x; bool ans=false;
x=x->right; if(root->left) ans+=hasPathSum2(root
} targetSum - root->val) ;
if(root->right) ans+=hasPathSum2(roo
targetSum - root->val);
parent=y; return ans;
z->key<y->key)
}
y->left=z; };
se
y->right=z;
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
indNode(int val){ if (!root) return nullptr;//importan
de *n;
oot; TreeNode* left = invertTree(root->le
le(n!=NULL && n->key!=val) TreeNode* right = invertTree(root->r
}
return n;
// class Solution {
// public:
// void invertTree(TreeNode* root) {
// if (!root) return;
indMaximum(Node *node){
->right==NULL return node; // // Recursively invert the left an
findMaximum(node->right); subtrees
// invertTree(root->left);
// invertTree(root->right);
private:
eNode(Node* root, int key) { bool isValidBST(TreeNode* root, TreeNode
case: If the tree is empty or key not found TreeNode* maxNode) {
t == NULL) if (!root) return true;
urn root;
// if minnode,maxnode is set check v
< root->key) if ((minNode && root->val <= minNode
t->left = deleteNode(root->left, key); (maxNode && root->val >= maxNode->val))
(key > root->key) return false;
t->right = deleteNode(root->right, key);
// left subtree all<root
Node with only one child or no child // riht subtree all>root
(root->left == NULL) { return isValidBST(root->left, minNod
Node* temp = root->right; && isValidBST(root->right, root, maxNode);
if (temp) }
temp->parent = root->parent; // Update the };
ter of the child
free(root);
return temp;
class Solution {
e* temp = minValueNode(root->right); public:
t->key = temp->key; void flatten(TreeNode* root) {
t->right = deleteNode(temp, temp->key); // Base case: Empty tree
if (!root) {
root;// in else block returned value paoar por upore return;
continue rakhte aita dorkar. }
temp->right != NULL) { i
temp->right->level = temp->level + 1; 1
q.push(temp->right); / \
2 5
/ \
3 4
ii
1
levelwise elements \
); 2
pty()){ \
q.size(); 3
level_elements; \
level_size) { get front ,push it in 4
nts ,push it's children ,pop it } iii
1
\
2
y'to bst. \
elper(int l, int r, vector<int>& nums) { 3
(l > r) return nullptr; \
mid = (l + r) / 2; 4
eNode* root = new TreeNode(nums[mid]); \
t->left = helper(l, mid - 1, nums); 5
t->right = helper(mid + 1, r, nums);
urn root;
urn numIslands;
class Solution {
s[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; public:
TreeNode* buildTree(vector<int>& inorder
s(vector<vector<char>>& grid, int i, int j) { vector<int>& postorder) {
unordered_map<int, int> index;
d[i][j] = '0'; //dfs approch. Marking visited at the for (int i = 0; i < inorder.size();
e will also take out it's children and shove it in index[inorder[i]] = i;
lls }
return buildTreeHelper(inorder, post
(auto dir : dirs) { inorder.size() - 1, 0, postorder.size() - 1,
int x = i + dir[0]; }
int y = j + dir[1];
TreeNode* buildTreeHelper(vector<int>& i
if (x >= 0 && y >= 0 && x < m && y < n && grid[x] vector<int>& postorder, int inorderStart, in
{ inorderEnd, int postorderStart, int postorde
unordered_map<int, int>& index) {
dfs(grid, x, y); if (inorderStart > inorderEnd ||
} postorderStart > postorderEnd) {
return nullptr;
}
int rootVal = postorder[postorderEnd
TreeNode* root = new TreeNode(rootVa
int inorderRootIndex = index[rootVal
int leftSubtreeSize = inorderRootInd
inorderStart;
ree check. root->left = buildTreeHelper(inorder
ion { postorder, inorderStart, inorderRootIndex -
postorderStart, postorderStart + leftSubtree
Symmetric(TreeNode* root) { index);
(!root) return true; // An empty tree is symmetric root->right = buildTreeHelper(inorde
on postorder, inorderRootIndex + 1, inorderEnd,
postorderStart + leftSubtreeSize, postorderE
ue<TreeNode*> q; index);
ush(root); return root;
}
le (!q.empty()) { };
int levelSize = q.size();
vector<int> levelElements; postorder : left ,right,root.So we have
postorderStart, postorderStart + leftSubtree
for (int i = 0; i < levelSize; ++i) { left and rest is right.
TreeNode* curr = q.front();
q.pop();
if (curr) {
levelElements.push_back(curr->val);
q.push(curr->left); Given an m x n matrix board containing 'X' a
q.push(curr->right); capture all regions that are 4-directionally
} else { surrounded by 'X'.
levelElements.push_back(INT_MIN); //
for null nodes
} A region is captured by flipping all 'O's in
} that surrounded region.
Input:
urn true; board = [
["X","X","X","X"],
["X","O","O","X"],
SymmetricLevel(const vector<int>& levelElements) { ["X","X","O","X"],
n = levelElements.size(); ["X","O","X","X"]]
(int i = 0; i < n / 2; ++i) {
if (levelElements[i] != levelElements[n - 1 - i]) { Output: [
return false; ["X","X","X","X"],
} ["X","X","X","X"],
["X","X","X","X"],
urn true; ["X","O","X","X"]]
;
s[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; int m = board.size();
o[i][j] = currPath;
urn currPath;