首先,二叉搜索树的寻找一个目标值的迭代版本比普通二叉树要简单,并且将该目标值的祖先节点保存值表中,如下:
public List<TreeNode> getPath(TreeNode root, TreeNode target){List<TreeNode> res = new ArrayList<>();//迭代搜索目标值while(root != target){if(target.val < root.val){res.add(root);root = root.left;}else if(target.val > root.val){res.add(root);root = root.right;}else{}}res.add(root);return res;}
求最近公共祖先节点的技巧:
- 二次遍历方法,用1中的迭代方法求出两个目标值的公共祖先链表,然后求这两个链表的最后一个相同值即可。
一次遍历方法,迭代版:要么两个目标值均小于当前节点值,那么公共祖先必定在当前节点的左子树中,更新当前节点为左节点。要么两个目标值均大于当前节点值,那么公共祖先必定在当前节点的右子树中,更新当前节点为右节点。否则,二者在当前节点处分叉,两个节点要么在当前节点的两颗子树上,要么其中一个就是当前节点。
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {while (true){if(p.val < root.val && q.val < root.val){root = root.left;}else if(p.val > root.val && q.val > root.val){root = root.right;}else {return root;}}}
一次遍历方法,递归版,思想跟上述一样。
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(p.val < root.val && q.val < root.val)return lowestCommonAncestor(root.left, p, q);if(p.val > root.val && q.val > root.val)return lowestCommonAncestor(root.right, p, q);return root;}
