开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情
二叉树的层序遍历
层序遍历我们会的,那就是用一个队列储存每一层的节点,当出队列的同时,把该节点的左右孩子节点也入队列。 但是本题目与我们之前做的题目有点稍微的不同,就是我们返回的是一个二维数组,每一层的元素构成一维数组存在二维数组中。
- 怎么解决这个问题呢?
用一个值去记录每一层节点的数目,出队列的时候,把节点数加一,当节点数为0的时候,说明该层节点遍历完成;下一层的节点的数目就是队列元素的个数。
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> vv;
queue<TreeNode*> q;
int sum=1;
if(root)
q.push(root);
vector<int> v;
while(!q.empty())
{
TreeNode* cur=q.front();
q.pop();
v.push_back(cur->val);
sum--;
if(cur->left)
q.push(cur->left);
if(cur->right)
q.push(cur->right);
if(sum==0)
{
sum=q.size();
vv.push_back(v);
v.clear();
}
}
return vv;
}
};
二叉树的最近公共祖先
这道题目我们可以用交叉链表的思想去做,我们把每个节点所在的路径找出来,两个路径相交的第一个节点就是他的最近公共祖先。对于该路径我们用栈进行储存下来。我们用中序遍历的方式去找路径。
- 找路径的过程
- 如果当前节点不是要查找的节点,去找左树,直到查找到空的时候还没有找到,那就删除左树;去找右树,找到了就是该节点,找不到把该节点从栈中删除,在从栈顶的左子树开始查找。
class Solution {
bool Find(TreeNode* root,TreeNode* airm,stack<TreeNode*>& st)
{
st.push(root);
if(root==nullptr)
return false;
if(root==airm)
{
return true;
}
if(!Find(root->left,airm,st))
{
st.pop();
root=st.top();
}
else
return true;
if(!Find(root->right,airm,st))
{
st.pop();
root=st.top();
}
else
return true;
return false;
}
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
stack<TreeNode*> pst,qst;
Find(root, p,pst);
Find(root,q,qst);
int i=pst.size()>qst.size()?pst.size()-qst.size():qst.size()-pst.size();
while(i--)
{
if(pst.size()>qst.size())
pst.pop();
else
qst.pop();
}
while(qst.top()!=pst.top())
{
pst.pop();
qst.pop();
}
return pst.top();
}
};