236. 二叉树的最近公共祖先

236. 二叉树的最近公共祖先


题目链接:236. 二叉树的最近公共祖先

代码如下:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
//思路:非递归后序遍历
class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        vector<TreeNode*> pStack,qStack;
        TreeNode* commonAncestor=nullptr;

        PostOrder(root,p,pStack);
        PostOrder(root,q,qStack);

        for(int i=0;i<pStack.size()&&i<qStack.size();i++)
        {
            if(pStack[i]==qStack[i])
                commonAncestor=pStack[i];
        }

        return commonAncestor;
    }

    //后续非递归遍历
    void PostOrder(TreeNode* root, TreeNode* leaves,vector<TreeNode*>& sta)
    {
        TreeNode* p=root;
        TreeNode* r=nullptr;

        while(p||!sta.empty())
        {
            if(p)//保存,一直找其左子树
            {
                sta.push_back(p);
                p=p->left;
            }
            else
            {
                p=sta[sta.size()-1];
                if(p->right&&p->right!=r)
                {
                    p=p->right;
                }
                else
                {
                    p=sta[sta.size()-1];
                    
                    //p为叶子节点,此时数组中保存的都是根到该叶子节点的节点
                    if(p==leaves)
                    {
                        return;
                    }

                    sta.pop_back();//弹出栈顶元素
                    r=p;
                    p=nullptr;
                }
            }
        }
        
    }
};

你可能感兴趣的:(leetcode,c++)