给定一棵二叉树。求两个树节点的最低公共祖先

来源:互联网 发布:百舌鸟导弹 知乎 编辑:程序博客网 时间:2024/06/03 22:57


本题源自leetcode。https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/description/

----------------------------------------------

代码: 递归

TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {        if(!root || 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;    }

非递归:

 TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {        vector<TreeNode*> left;        vector<TreeNode*> right;                TreeNode* node=root;        TreeNode* res=NULL;        while(node){   //遍历左子树            if(node == p || node == q){                if(res == NULL)                    res = node;                else                    return res;            }            left.push_back(node);            node = node->left;        }        while(left.size()){            TreeNode* node = left.back();            if(node->right == NULL){  //如果没有右子树,就向上遍历                left.pop_back();                if(node->left && node->left == res)                    res = node;                continue;            }             if(right.size() && node == right.back()){  //返回父节点                left.pop_back();                right.pop_back();                if(res && (node->left == res || node->right == res))                    res = node;                continue;            }            if(res && (node->left == res || node->right == res))  //公共节点 上移                res = node;            right.push_back(node);            node = node->right;   //遍历右子树            while(node){                if(node == p || node == q){                    if(res)                        return res;                    else                        res = node;                }                left.push_back(node);                node=node->left;            }        }        return NULL;    }


阅读全文
0 0
原创粉丝点击