关于查找二叉树的最近公共节点
递归
------------------------------------------------------------------------------
(后序遍历二叉树),假设遍历到的当前结点为cur,因为是后序遍历,所以先处理cur的两颗子树,假设处理cur左子树时返回left,处理右子树时返回right.
1,如果发现cur等于null,或者o1,o2。则返回cur.
2,如果left和right都为空,说明cur整棵子树都没有发现过o1 和o2,返回null.
3.如果left和right都不为空,说明左子树上发现过o1 和 o2,右子树上也发现过o1 和o2,说明o1 向上与o2向上的过程中,首次在cur相遇,返回cur.
4,如果left和right是有一个为空,另一个不为空,假设不为空的那个记为node,此时又两种肯,要么node是o1或o2中的一个,要么node已经是o1和o2的最近公共祖先节点,此时直接返回node即可
————————————————------------------------------
总的来说,就是遇到o1或者o2就返回,然后利用后序遍历的特性,这样可以保证找到的公共祖先是最近的
-------------------------------------------------------------------------------
dfs递归写法
查找两个node的最近公共祖先,分三种情况:
- 如果两个node在root的两边,那么最近公共祖先就是root。
- 如果两个node在root的左边,那么把root的左子树作为root,再递归。
- 如果两个node在root的右边,那么把root的右子树作为root,再递归。
深度优先遍历二叉树,一旦找到了两个节点其中的一个,就将这个节点返回给上一层,上一层节点通过判断其左右子树中是否恰好包含n1和n2两个节点,如果找到,对应的上一层节点肯定是所求的LCA;若不是,将包括两个节点中任意一个的较低的节点返回给上一层,否则返回NULL。
-----------------------------------------------------------------------------------------------------------