1.中序遍历+循环判断(结合二叉搜索树那题,自己写的代码
昨天的二叉搜索树:
递归&&迭代&&剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
依旧按照三种情况判断两个结点在左孩子、右孩子、异侧的情况,不过判断操作单独写在一个void dfs()函数里面。解答过程中,画图分析代码错误最后写出来,这个有冗余操作,每一次都要判断两个结点在哪一边(调用dfs()函数),增加了时间复杂度。
/**
* 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:
int pnum,qnum,count;
void dfs(TreeNode*root,int rnum){ //判断p,q位于左孩子、右孩子、异侧
if(!root) return ;
dfs(root->left,rnum);
if(root->val==rnum) return; //剪枝操作,只需要判断左边有无p,q,中序遍历
if(root->val==pnum||root->val==qnum) count+=1;
dfs(root->right,rnum);
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
pnum=p->val;
qnum=q->val;
while(root){
count=0;
dfs(root,root->val);
// cout<<root->val<<" "<<"count="<<count<<endl;
if(root!=p&&root!=q){
if(count==2) root=root->left;
else if(count==0) root=root->right;
else break;
}
else break;
}
return root;
}
};
2.递归(参考大佬的解法,极大优化时间复杂度,减少冗余操作
附上大佬力扣题解:
剑指 Offer 68 - II. 二叉树的最近公共祖先(DFS ,清晰图解)
递归:(1)终止条件;(2)递归工作;(3)返回值。
这里返回值有四种情况,原来直接返回结点就好了。
/**
* 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||root==p||root==q){
return root;
}
TreeNode*left=lowestCommonAncestor(root->left,p,q);
TreeNode*right=lowestCommonAncestor(root->right,p,q);
if(left==NULL){
return right;
}
if(right==NULL){
return left;
}
return root;
}
};
刷完剑指offer的简单题了。
发完昨晚那篇blog,积分达到400,博客等级升到3,换了个皮肤,增加了"K神"的标签(狗头