剑指OFFER 68-||.二叉树的最近公共祖先
题目描述如下:
解题思路以及过程
这题虽然是leetcode中的简单难度,但是对于我而言还是具有一定的难点,虽然我已再次学了二叉树,但是对于实际应用的实现还是有点措手不及的
官方的解答还是值得去学习的
/**
* 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 *ans;//全局变量用来存储最终结果的
//使用深度遍历
bool dfs(TreeNode* root, TreeNode* p, TreeNode* q){
//遍历终止条件
if(root==NULL) return false;
bool lson=dfs(root->left,p,q);
bool rson=dfs(root->right,p,q);
//满足条件的情况有:
//(1)当前结点的左孩子和右孩子分别拥有p,q
//(2)当前结点为p或q,则它的左孩子或右孩子则必须要有q或p
if((lson&&rson)||((root->val==p->val||root->val==q->val)&&(lson||rson))){
ans=root;
}
//递归返回父节点是,左孩子或右孩子中存在p或q,或者是当前遍历的结点是p或q
return lson||rson||(root->val==p->val||root->val==q->val);
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
dfs(root,p,q);
return ans;
}
};
总结:
/学会适可而止,退而求其次