Skip to content

Commit 089543e

Browse files
author
sam41290
committed
LCA
1 parent 3e181f7 commit 089543e

4 files changed

+261
-0
lines changed

binarytree_levelorder_traversal.cpp

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/*
2+
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).
3+
4+
For example:
5+
Given binary tree [3,9,20,null,null,15,7],
6+
3
7+
/ \
8+
9 20
9+
/ \
10+
15 7
11+
return its level order traversal as:
12+
[
13+
[3],
14+
[9,20],
15+
[15,7]
16+
]
17+
*/
18+
19+
20+
/**
21+
* Definition for a binary tree node.
22+
* struct TreeNode {
23+
* int val;
24+
* TreeNode *left;
25+
* TreeNode *right;
26+
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
27+
* };
28+
*/
29+
class Solution {
30+
public:
31+
vector<vector<int>> levelOrder(TreeNode* root) {
32+
vector<vector<int>> ret;
33+
if(root==NULL)
34+
return ret;
35+
vector<TreeNode *> fringe;
36+
int fringe_pos = 0;
37+
int next_itr = 1;
38+
fringe.push_back(root);
39+
40+
while(next_itr != 0)
41+
{
42+
vector<int> tmp;
43+
44+
int i = next_itr;
45+
next_itr = 0;
46+
TreeNode *cur;
47+
for(int j=0;j<i;j++)
48+
{
49+
cur=fringe[fringe_pos];
50+
tmp.push_back(cur->val);
51+
if(cur->left!=NULL)
52+
{
53+
fringe.push_back(cur->left);
54+
next_itr++;
55+
}
56+
if(cur->right!=NULL)
57+
{
58+
fringe.push_back(cur->right);
59+
next_itr++;
60+
}
61+
fringe_pos++;
62+
}
63+
ret.push_back(tmp);
64+
}
65+
return ret;
66+
}
67+
};
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
/*
2+
Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to right, then right to left for the next level and alternate between).
3+
4+
For example:
5+
Given binary tree [3,9,20,null,null,15,7],
6+
3
7+
/ \
8+
9 20
9+
/ \
10+
15 7
11+
return its zigzag level order traversal as:
12+
[
13+
[3],
14+
[20,9],
15+
[15,7]
16+
]
17+
*/
18+
19+
20+
/**
21+
* Definition for a binary tree node.
22+
* struct TreeNode {
23+
* int val;
24+
* TreeNode *left;
25+
* TreeNode *right;
26+
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
27+
* };
28+
*/
29+
class Solution {
30+
public:
31+
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
32+
vector<vector<int>> ret;
33+
if(root==NULL)
34+
return ret;
35+
vector<TreeNode *> fringe;
36+
int depth = 0;
37+
int fringe_pos = 0;
38+
int next_itr = 1;
39+
fringe.push_back(root);
40+
41+
while(next_itr != 0)
42+
{
43+
vector<int> tmp;
44+
if(depth%2!=0)
45+
{
46+
int j = fringe_pos + next_itr - 1;
47+
while(j>=fringe_pos)
48+
{
49+
tmp.push_back(fringe[j]->val);
50+
j--;
51+
}
52+
}
53+
else
54+
{
55+
int j = fringe_pos;
56+
while (j<=(fringe_pos + next_itr - 1))
57+
{
58+
tmp.push_back(fringe[j]->val);
59+
j++;
60+
}
61+
}
62+
ret.push_back(tmp);
63+
int i = next_itr;
64+
next_itr = 0;
65+
TreeNode *cur;
66+
for(int j=0;j<i;j++)
67+
{
68+
cur=fringe[fringe_pos];
69+
if(cur->left!=NULL)
70+
{
71+
fringe.push_back(cur->left);
72+
next_itr++;
73+
}
74+
if(cur->right!=NULL)
75+
{
76+
fringe.push_back(cur->right);
77+
next_itr++;
78+
}
79+
fringe_pos++;
80+
}
81+
depth++;
82+
}
83+
return ret;
84+
}
85+
};
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* struct TreeNode {
4+
* int val;
5+
* TreeNode *left;
6+
* TreeNode *right;
7+
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
8+
* };
9+
*/
10+
class Solution {
11+
public:
12+
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
13+
14+
cout<<preorder.size()<<" "<<inorder.size()<<"\n";
15+
16+
if(preorder.size()==0 || inorder.size()==0)
17+
return NULL;
18+
19+
TreeNode *root = new TreeNode(preorder[0]);
20+
21+
vector<int> inorder_left;
22+
23+
int i;
24+
for(i = 0;i<inorder.size();i++)
25+
{
26+
if(inorder[i]==preorder[0])
27+
break;
28+
inorder_left.push_back(inorder[i]);
29+
}
30+
vector<int> preorder_left;
31+
int j;
32+
for(j=1;j<=i;j++)
33+
preorder_left.push_back(preorder[j]);
34+
35+
root->left = buildTree(preorder_left,inorder_left);
36+
37+
int right_size = inorder.size() - (i+1);
38+
if(right_size > 0)
39+
{
40+
vector<int> inorder_right(inorder.begin() + i + 1,inorder.end());
41+
vector<int> preorder_right(preorder.begin() + i + 1,preorder.end());
42+
root->right = buildTree(preorder_right,inorder_right);
43+
}
44+
return root;
45+
46+
}
47+
};

lowest_common_ancestor.cpp

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* struct TreeNode {
4+
* int val;
5+
* TreeNode *left;
6+
* TreeNode *right;
7+
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
8+
* };
9+
*/
10+
class Solution {
11+
public:
12+
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
13+
vector<TreeNode *> stack;
14+
TreeNode *ret;
15+
int x=-1,y=-1,top=-1;
16+
TreeNode *current = root;
17+
int found = 0;
18+
while(current!=NULL)
19+
{
20+
stack.push_back(current);
21+
top++;
22+
if(current == p || current == q)
23+
{
24+
if(y==-1)
25+
{
26+
x=top;
27+
y=1;
28+
ret=stack[x];
29+
}
30+
cout<<"lca ind:"<<x<<"\n";
31+
found++;
32+
}
33+
if(found == 2)
34+
return ret;
35+
if(current->left==NULL)
36+
{
37+
while(top>=0)
38+
{
39+
current = stack[top];
40+
top--;
41+
if(y==1 && x>top)
42+
{
43+
ret=stack[x];
44+
x=top;
45+
}
46+
stack.pop_back();
47+
if(current->right != NULL)
48+
{
49+
break;
50+
}
51+
}
52+
current=current->right;
53+
continue;
54+
55+
}
56+
current=current->left;
57+
}
58+
if(found==2)
59+
return ret;
60+
return NULL;
61+
}
62+
};

0 commit comments

Comments
 (0)