题解 | #在二叉树中找到两个节点的最近公共祖先#
在二叉树中找到两个节点的最近公共祖先
https://www.nowcoder.com/practice/e0cc33a83afe4530bcec46eba3325116
后续遍历非递归解法:
1. 需要设置两个标志位find1和find2,代表是否找到这两个数.
2. 在后序遍历进栈的过程中,如果一个数字都没找到,就将结点p和标识1进站,找到其中一个后,对应标志位置true,在此之后将节点p和标志位0进栈。
3. 在后序遍历出栈的过程中,如果两个数都已经找到,并且标识为1,则这个节点就为最近公共父节点。
/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */ class Solution { public: /** * * @param root TreeNode类 * @param o1 int整型 * @param o2 int整型 * @return int整型 */ int lowestCommonAncestor(TreeNode* root, int o1, int o2) { stack<pair<TreeNode*, int>> s; TreeNode *p = root, *pre = nullptr; bool find1 = false, find2 = false; int tmp; while(p || !s.empty()) { while(p) { if(!find1 && !find2) s.emplace(p, 1); else s.emplace(p, 0); if(p->val == o1) find1 = true; else if(p->val == o2) find2 = true; p = p->left; } p = s.top().first; tmp = s.top().second; if(p->right && p->right != pre) { p = p->right; } else { if(tmp && find1 && find2) return p->val; if(p->val == o1) find1 = true; else if(p->val == o2) find2 = true; s.pop(); pre = p; p = nullptr; } } return -1; } };