[程序员代码面试指南]二叉树问题-在二叉树中找到两个节点的最近公共祖先、[LeetCode]235. 二叉搜索树的最近公共祖先(BST)(非递归)

题目

题解

法一:

  • 按照递归的思维去想:
    • 递归终止条件
    • 递归
    • 返回值
      • 1 如果p、q都不在root为根节点的子树中,返回null
      • 2 如果p、q其中之一在root为根节点的子树中,返回该节点
      • 3 如果p、q都在root为根节点的子树子树中,返回root节点
  • 代码逻辑:
    1 如果是遍历到null/node1/node2 => 会返回对应节点:null/node1/node2。
    遍历左右子树:
    2 如果两个子树都含node1/node2(因为二叉树中无重复元素,所以肯定是一边含一种node)=> 会返回此时的根节点:root;
    3 如果两个子树只有一个子树含node1/node2 => 会返回node1/node2;如果两个子树都不含node1/node2=> 会返回:null;
    4 如果是最近公共祖先的上层节点,=>会将最近公共祖先节点返回:node1/node2 。(此种情况可与3的前半种情况合并为一个判断分支)

todo

更新别的方法

法一代码

	public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
		if (root == null || root == p || root == q) {
			return root;
		}
		TreeNode lNode = lowestCommonAncestor(root.left, p, q);
		TreeNode rNode = lowestCommonAncestor(root.right, p, q);
		if (lNode == null && rNode == null) {
			return null;
		}
		if (lNode != null && rNode != null) {
			return root;
		}
		return lNode != null ? lNode : rNode;
    }

题目 235. 二叉搜索树的最近公共祖先

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

题解

  • 迭代、递归均可。这里使用迭代。
  • root往下走,找到第一个节点值介于两个目标节点值中间的节点。
  • 时间负责度O(n),空间O(1)

代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        while(root!=null){
            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;
            }
        }
        return null;
    }
}

posted on 2019-06-13 00:15  coding_gaga  阅读(233)  评论(0编辑  收藏  举报

导航