题解 | #在二叉树中找到两个节点的最近公共祖先#

在二叉树中找到两个节点的最近公共祖先

https://www.nowcoder.com/practice/e0cc33a83afe4530bcec46eba3325116

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    void postOrderTravesal(TreeNode* root, vector<int>& Ancestor, int o) {
        stack<TreeNode*> s;
        TreeNode* p = root;
        TreeNode* r;        // 标记最近访问过的结点
        while (p != nullptr || !s.empty()) {
            // 一直向左
            if (p != nullptr) {
                s.push(p);
                p = p->left;
            } else {
                // 获取栈顶结点
                p = s.top();
                // 如果右子树存在且未被访问
                if (p->right && p->right != r) {
                    p = p->right;
                    s.push(p);
                    p = p->left;
                } else {
                    // 若右子树不存在或者右子树被访问过了
                    
                    // 访问当前结点
                    if (p->val == o) {
                        break;
                    }
                    s.pop();
                    r = p;
                    p = nullptr;
                }
            } 

        }
        while (!s.empty()) {
            TreeNode* temp = s.top();
            s.pop();
            Ancestor.push_back(temp->val);
        }

    }
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @param o1 int整型 
     * @param o2 int整型 
     * @return int整型
     */
    int lowestCommonAncestor(TreeNode* root, int o1, int o2) {
        // write code here
        vector<int> a1, a2;
        int res;
        postOrderTravesal(root, a1, o1);
        postOrderTravesal(root, a2, o2);



        int len1 = a1.size(), len2 = a2.size();
        while (a1[len1-1] == a2[len2-1]) {
            len1--;
            len2--;
        }
        res = a1[len1];


        return res;
    }
};

使用后续遍历的思想:

  • 遍历到目标结点就停,得到根节点到目标节点的路径
  • 从后向前遍历路径,当遇到两个不相等的节点后退出
  • 推出后得到最近的公共祖先节点
全部评论

相关推荐

点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务