在博客當中看到了一個對二叉樹的最近公共祖先的巧解,代碼也非常簡單,特此用博客記錄一下別人大神的思路。node
思路來自:http://blog.csdn.net/github_34514750/article/details/52229129git
遍歷判斷兩個node是否在左右子樹中
通常遞歸都分爲兩塊返回值;
第一塊返回值(開頭):
針對l或者r的返回,也就是標記,我本身稱爲小返回
第二塊返回值(結尾):
l和r已經獲取完畢,對上一層的返回,我本身稱爲大返回github
public class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { // 左右子樹探索時發現目標節點,則經過返回值標記 if(root == null || p == root || q == root) { return root; } // 查看左子樹中是否有目標結點,沒有爲null TreeNode l = lowestCommonAncestor(root.left,p,q); // 查看右子樹中是否有目標結點,沒有爲null TreeNode r = lowestCommonAncestor(root.right,p,q); //都不爲空,說明作右子樹都有目標結點,則公共祖先就是自己 if(l!= null && r!= null) { return root; } // 其餘狀況,則要繼續向上標記,顯示此節點下邊有目標節點 return l != null?l:r; } }
這種解法適用於各種二叉樹的最近公共祖先的解法。無需考慮是不是搜索樹。非常巧妙,而且代碼簡單易讀、spa