1. 首先,二叉搜索树的寻找一个目标值的迭代版本比普通二叉树要简单,并且将该目标值的祖先节点保存值表中,如下:

      1. public List<TreeNode> getPath(TreeNode root, TreeNode target){
      2. List<TreeNode> res = new ArrayList<>();
      3. //迭代搜索目标值
      4. while(root != target){
      5. if(target.val < root.val){
      6. res.add(root);
      7. root = root.left;
      8. }else if(target.val > root.val){
      9. res.add(root);
      10. root = root.right;
      11. }else{
      12. }
      13. }
      14. res.add(root);
      15. return res;
      16. }
    2. 求最近公共祖先节点的技巧:

      1. 二次遍历方法,用1中的迭代方法求出两个目标值的公共祖先链表,然后求这两个链表的最后一个相同值即可。
      2. 一次遍历方法,迭代版:要么两个目标值均小于当前节点值,那么公共祖先必定在当前节点的左子树中,更新当前节点为左节点。要么两个目标值均大于当前节点值,那么公共祖先必定在当前节点的右子树中,更新当前节点为右节点。否则,二者在当前节点处分叉,两个节点要么在当前节点的两颗子树上,要么其中一个就是当前节点。

        1. public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        2. while (true){
        3. if(p.val < root.val && q.val < root.val){
        4. root = root.left;
        5. }else if(p.val > root.val && q.val > root.val){
        6. root = root.right;
        7. }else {
        8. return root;
        9. }
        10. }
        11. }
      3. 一次遍历方法,递归版,思想跟上述一样。

        1. public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        2. if(p.val < root.val && q.val < root.val)
        3. return lowestCommonAncestor(root.left, p, q);
        4. if(p.val > root.val && q.val > root.val)
        5. return lowestCommonAncestor(root.right, p, q);
        6. return root;
        7. }