Lowest Common Ancestor of a Binary Tree
2015-11-21 22:38
274 查看
题目描述:
Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree.
According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes v and w as the lowest node in T that has both v and w as descendants (where we allow a node to be a descendant of itself).”
For example, the lowest common ancestor (LCA) of nodes
题目分析:
首先,题目给出的是一个二叉树,同时给定两个节点,要求寻找两个节点的最低公共祖先(可以为两节点)。也就是说目标节点的左右子树分别包含两个节点,或者是节点本身。
解题思路:
节点a与节点b的公共祖先c一定满足:a与b分别出现在c的左右子树上(如果a或者b本身不是祖先的话)。首先想到的是递归孙发,分别在根节点的左子树和右子树进行寻找,找到两节点,返回当前节点,没有找到则返回空。若根节点的左右子树找到了两节点,该节点就是所找的LCA。
代码:
为了让读者更容易明白此算法,下面举个例子进行分析:
寻找6,4的LCA
![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOgAAACQCAIAAACNurCDAAAEQUlEQVR4nO3d0ZmqMBRF4enJZuiFTiiFRqjE93lQmKCOIjmQvZP1F3C/TGYZuJIJP1fA0E/pAQB7EC4sES4sES4sES4sES4sES4sES4sES4sES4sEe5+Y3+ZdcNUejSNIdwA09CR7skIN8A0dJd+LD2KthBujvlmgeX2dIQbYewvLLnnItwQY8+qey7CjUC3pyPc3fg2rCTChSXChSWLcJOLsoqXNwdlx9nW/YpFuMAjwoUlwoUlwoUlwoUlwoUl7XDZL/idhuZLOtxp6Nr6cjLf2DdSrnK4bF3ZoZUPu3C4zSwesRopVzbcRub/CE184lXD5TYhQwuTJxpuE4vGcRq4XEmG28C8H636T75iuC1c6Q5X+yTqhdvQl+iHqnwe9cIFNiBcWCJcWCJcWCJcWCJcWCJcWCJcWCJcWCJcWBIMdxq65GChip9anuc+pTXNpWi4NU1xabftNrXNKuE2orZZFQ23zRMIj0S4J5qGrq4bs4II90y8+S4M4Z5o7LlZiEK4h0vucak2wOM56XXkKxgu8BnhwlJ4uJkv8Mh8KUh99xbM52usuLBEuLBEuLBEuLBEuLBEuLAUF67KM0WVceRS+TlUxvEgLFyho0GrOGKT+XwvKlypUy2Fful7MZ8fBIUr9qFUnOmvMJ+fhIQr+HOJ/ea/w3x+FhGu1GVtJjmobSSHrjaogHDlPow3gsvWNsznFtnhiv08KdEC3mM+t8kNV+0KsiI9uNekh6w0uLxwRb+cXqiP75H6eIXGxyNfWCJcWCJcWCJcWCJcWCJcWCJcWCJcWCJcWCJcWAra1qh+YE96BqTyKH3GmR7jVOIpcG64JkcvT0N3n13tAY/9koHQvoBn6UaxMltvMsNV2i+0UdKGnGQ6byuv6kCTj3+hBLJ3h3XDOF/cLBJWXsiWsd2OYh+0V4X7zUKhyczf1rhMrsPqq7zczuEuYxSe0L/XypR63UHAirsMWmqH/DODd/iMfXLhEr42rIZWZjHIvMdNfgLt//UYVHu9rhZZ5YtD+rsu9HuP+Juzkt+KbLN+PbDJUHVXget6RotMJg8gYIlwYamycF++lkP6mot9KgsXrSBcWCJcWCJcWCJcWCJcWCJcWKol3D07UoR3seCTSsLdeaqs+H42/K+OcHfvXBU+RhlvVRFuxsJJuaYqCDezPW4XLPmHm/0HLsJ/IYN/2YcbsGByu2DIPNyg5rhdsOMdbthVntsFN87hRj5A4GGEGedw0TDChSXChSXChSXChSXChSXChSXChSXChSXncJ/OWwp89KV9kj2sw10J3W0w9peu73kILKyScEO3Gtw+A+xekFZHuJHL7fxvEa60GsKNTOxvZy7hSvMPN/IdBE9H7nO6rir7cA97xwcrrjTzcA985QvhSjMPF60iXFgiXFgiXFgiXFgiXFgiXFgiXFgiXFgiXFgiXFgiXFgiXFgiXFj6Bb4uCpSCd/dEAAAAAElFTkSuQmCC)
第一步:
根节点3,不是所找节点,进入3的左右子树5,1寻找。
![](data:image/png;base64,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)
第二步:
根节点5,不是所找节点,进入5的左右节点6,2寻找;
根节点1,不是所找节点,进入1的左右节点0,8寻找。
![](data:image/png;base64,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)
第三步:
根节点6,是所找节点,返回此节点;
根节点2,不是所找节点,进入2的左右节点7,4寻找;
根节点0,8,不是所找节点,返回NULL。
![](data:image/png;base64,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)
第四步:
根节点7,不是所找节点,返回NULL。
根节点4,是所找节点,返回此节点;
![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOoAAACnCAIAAACQMFerAAAGZklEQVR4nO3dsZWjOhiGYTXiSGW4AEpwDcRuwCnRlEHiLohdArVwA/kwGmbHF4Mk/k9+n7OBd4N7Wfk1y2AJuQmQ5Y4+AGA78oUw8oUw8oUw8oUw8oUw8oUw8oUw8oUw8oUw8oUw8oUw8oUw8k3Ge++cc851XXf0sXwK8k2jaZpxHMNr59wwDMcez4cg3zS8933fh9dd13ECLoN80xPK93a7HX0Iu5BvYuM4eu+PPoq1yBffwo9u80WwTXGy5Isl773Zi4fb7Ua+eMXs9cPtl6OPaC/yTcM5N995GMfROaMDW0e1M6OjLCe+5G2apm3bY4/nBfLFUjjjBpbbrQz5QpjpfJ0IleMv+d6VUeFfCZ+DfCGMfCGMfCGMfCGMfCGMfCHMaL5937PeJod4UVMFjObL966ZDMNgdjLnBhbz5dSbVdM0Rx9CMhbz5dSbVdd11ZwdzOXLqTe3cRz/9wShMqnSXL6cegv43+sH8t2CU28Zfd/Pa0NmimvgbOXLqbeYxQlYdAmnoXw59ZbUtu18A1h3CaehfDn1lrS4AaxV7cxKvpx6y/t9/XDUkWxmJV9OveVVcAPYRL6ceg+x5gawcSbyxVHUZ/CQL4SRL4SRL4SRL4SRL4SRL4SRL4RZybfv+/hhcjUtaNGi9UWGoXyl75+rG4YhnDjId4ualr/q6rqOfLcgXwuS55t7FpuVfMPylfDvl81teT4B+W7Utu08cPFrlJQk35KLjqzkG7O8sVTd9udbeM2c0UrI9xA78y2/Zs5KJe7ntn5c/h4i+dk3N0P5xtv6cSPiEMmvfXOzku8UbSPFV27lzV9bBL8fYmKToXyBd+3KN/d2ean+O7Vi/D/uLUdNyBfCyBfCyBfCyBfCyBfCyBfCNuZr9qF66g/tWonxDzbma3Y+bmXb7v2F8Q+25Gv2ox9UP2WC8Z9tydfsRz+o4KnLrzH+s7fzNf7Rn6p46vILdYx/qkmVb+crUUbF1w91jP8x+dr/6Af/3HavAtLjn2MN3Hv5Snz0gypPwLrjn2kJ5xv5qnz0g3jbvTrojn++JZxv5Cv00Z9qvAEsPf6ZlnCuzVfrox/UdP1Qwfgfma/WRz+o6QYw4/9Pq/JV/OhPFd0AZvz/UvmMsw+ZwWNW7vGvPF/UjXwhjHwhjHwhjHwhjHwhjHwhjHwh7J18H4/JueevxyPbIeXSNE14EKLoo9u7rgvHLzoVyXsfjj/hXJTV+YZ2Q7WXy3S5pDqCMtq2nSdQK+5cFHYNC6+993KT8eNj7rouVcGr8z2fp6+vJP/LQ8RPn1XcO6Npmvnt7/tebjLdYsBTjf/qfDUvGGbxp38cR623P+wUNk8eUNw4zHsfT374a/zfnVS5bhTmKwfla99Z13Va//iGjSfiP4lrlhD+CmHYX1y55cn3fp+cm87n52+/vr5fqxmGQe7Ct4J8p2ny3oefnhc/eu5ZA/dOvvEZ93RSPAEPw6B12RBUkG88c9J7Pxe8cwnnOxcPMcF85S55Z+rXvr//xQvHv38J5+pROJ2m+/3Hb6XyXdxtkLt1Gv/oKXfn4a98p91LOFfne71+n4AFr30X77fW2z/9vO/rnJNbOxQf8+K+b5F8p2m6XJ63HdTaXWwZmfaLn2LUv3XLMfhKl1DAQlX52tntEWXw1kIY+UIY+UIY+UIY+UIY+UIY+UJYJflufgYjz/CTVkm+m6fw1vcQ9o9SQ747H3+rOP8BQQ357lw9UdND2D+NfL77nzxechdIpCWfb5KFa8V2gURa2vmm2vSh2C6QSEs734RrhsvsAom0hPNNu99OmV0gkZZwvmkf11BmF0ikpZpvjq3OCuwCibRU883xpBxuAMuRzDfTLpPV7ML5OSTzzYcZPFrIF8LIF8LIF8LIF8LIF8LIF8LIF8LIF8JU823bttBjJO93uecZfw7VfOPpNeM4ZlwtfDqRr1mq+caLIzK2G7ZEIF+rVPOdZTz1Ph7PDWn+zpdJlceSzzfjHLHzeXo8yNcy7XwzTnG8Xp9bkP/KlzVwdmjnm2t34sdjul6fr3/myxJOU7TzbZomy/qI8BPb4tf1yhJOa7TzLbFB38uzL44lnG/Y2rdwvhMXDJaQ70un0/fFQ7ylM2wQzhcgXwgjXwgjXwgjXwgjXwgjXwgjXwgjXwgjXwgjXwgjXwgjXwgjXwgjXwgjXwgjXwj7DwIITpC1VpIrAAAAAElFTkSuQmCC)
第五步:
返回L = 6,R= 2,返回root = 5,找到结果。
![](data:image/png;base64,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)
![](data:image/png;base64,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)
分析一下此算法的复杂度,最坏的情况,也就是每个节点都需要进行检查,时间复杂大为O(n),空间复杂的为O(1)。
递归算法优点是思路很清晰,代码非常简洁,缺点是,在寻找的两个节点处于较深的位置时,需要多次压栈迭代,算法复杂度较高。
此博客中的内容均为原创或来自网络,不用做任何商业用途。欢迎与我交流学习,我的邮箱是lsa0924@163.com
Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree.
According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes v and w as the lowest node in T that has both v and w as descendants (where we allow a node to be a descendant of itself).”
_______3______ / \ ___5__ ___1__ / \ / \ 6 _2 0 8 / \ 7 4
For example, the lowest common ancestor (LCA) of nodes
5and
1is
3. Another example is LCA of nodes
5and
4is
5, since a node can be a descendant of itself according to the LCA definition.
题目分析:
首先,题目给出的是一个二叉树,同时给定两个节点,要求寻找两个节点的最低公共祖先(可以为两节点)。也就是说目标节点的左右子树分别包含两个节点,或者是节点本身。
解题思路:
节点a与节点b的公共祖先c一定满足:a与b分别出现在c的左右子树上(如果a或者b本身不是祖先的话)。首先想到的是递归孙发,分别在根节点的左子树和右子树进行寻找,找到两节点,返回当前节点,没有找到则返回空。若根节点的左右子树找到了两节点,该节点就是所找的LCA。
代码:
/** * 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) return NULL; if (root == p || root == q) return root; TreeNode *L = lowestCommonAncestor(root->left, p, q); TreeNode *R = lowestCommonAncestor(root->right, p, q); if (L && R) return root; return L ? L : R; } };
为了让读者更容易明白此算法,下面举个例子进行分析:
寻找6,4的LCA
第一步:
根节点3,不是所找节点,进入3的左右子树5,1寻找。
第二步:
根节点5,不是所找节点,进入5的左右节点6,2寻找;
根节点1,不是所找节点,进入1的左右节点0,8寻找。
第三步:
根节点6,是所找节点,返回此节点;
根节点2,不是所找节点,进入2的左右节点7,4寻找;
根节点0,8,不是所找节点,返回NULL。
第四步:
根节点7,不是所找节点,返回NULL。
根节点4,是所找节点,返回此节点;
第五步:
返回L = 6,R= 2,返回root = 5,找到结果。
分析一下此算法的复杂度,最坏的情况,也就是每个节点都需要进行检查,时间复杂大为O(n),空间复杂的为O(1)。
递归算法优点是思路很清晰,代码非常简洁,缺点是,在寻找的两个节点处于较深的位置时,需要多次压栈迭代,算法复杂度较高。
此博客中的内容均为原创或来自网络,不用做任何商业用途。欢迎与我交流学习,我的邮箱是lsa0924@163.com
相关文章推荐
- Android学习之四大组件简单介绍
- 对接alipay支付遇到的问题
- 白话经典算法系列之二 直接插入排序的三种实现
- C语言基础学习——第11天(预处理)
- Hi~
- 005--VS C++ 加载位图
- arduino ide找不到目标文件
- LightOJ 1017 Brush (III)
- 初识python
- BZOJ 2466: [中山市选2009]树( 高斯消元 )
- c++嵌套类-内存分配
- 【转】一起来说 Vim 语
- Python shutil模块
- 蓝懿 iOS 技术交流和心得分享 11.21
- android之Radio状态
- 白话经典算法系列之一 冒泡排序的三种实现
- 针对Mandelbrot Set引发的函数迭代的思考与实验(2) 以及对连续量的认识
- 计算器使用
- leetcode remove Nth Node from End python
- 软件工程课程设计——第一个Spring