【LeetCode 236】C++實現遞歸、非遞歸求二叉樹的最近公共節點

/**
 * 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) {
        if(root == NULL || p == root || q == root)
        {
            return root;
        }
        TreeNode* left = lowestCommonAncestor(root->left,p,q);
        TreeNode* right = lowestCommonAncestor(root->right,p,q);
        if(left == NULL)
        {
            return right;
        }
        else if(right == NULL)
        {
            return left;
        }
        else
            return root;
    }
};

/**
 * 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:
        bool Getpath(TreeNode* root,TreeNode* node,stack<TreeNode *>& path)
        {
            if(NULL == root)
            {
                return false;
            }
            path.push(root);
            if(root == node)
            {
                return true;
            }
            if(Getpath(root->left,node,path))
            {
                return true;
            }
            if(Getpath(root->right,node,path))
            {
                return true;
            }
            path.pop();
            return false;
        }
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        stack<TreeNode *> ppath;
        stack<TreeNode *> qpath;
        Getpath(root,p,ppath);
        Getpath(root,q,qpath);
        while(ppath.size() != qpath.size())
        {
            if(ppath.size() > qpath.size())
            {
                ppath.pop();
            }
            else
                qpath.pop();
        }
        while(ppath.top() != qpath.top())
        {
            ppath.pop();
            qpath.pop();
        }
        return qpath.top();
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章