二叉树的层序遍历,二叉树的最近公共祖先

56 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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;
    }
};

二叉树的最近公共祖先

这道题目我们可以用交叉链表的思想去做,我们把每个节点所在的路径找出来,两个路径相交的第一个节点就是他的最近公共祖先。对于该路径我们用栈进行储存下来。我们用中序遍历的方式去找路径。

  • 找路径的过程
  1. 如果当前节点不是要查找的节点,去找左树,直到查找到空的时候还没有找到,那就删除左树;去找右树,找到了就是该节点,找不到把该节点从栈中删除,在从栈顶的左子树开始查找。
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();
    }
};