ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

算法:二叉树公共父节点

2021-01-03 15:32:49  阅读:252  来源: 互联网

标签:TreeNode val 算法 parents 二叉树 return root 节点


题目

https://leetcode-cn.com/problems/er-cha-shu-de-zui-jin-gong-gong-zu-xian-lcof/

题目

思路1

采用从上到下找当节点是不是p的父节点,然后反向遍历p的父节点,返回是不是q的父节点就行。

代码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) {
        /** 解法1:找出p所有的父节点,然后找出q所有的父节点。反向遍历能找到公共的子节点 */
        if (isParent(p , q) ) {
            return p;
        }
        if (isParent(q, p)) {
            return q;
        }
        
        List<TreeNode> parents = new ArrayList<TreeNode>();
        addParent(root, p,parents);
        for(int i = parents.size() -1 ; i >=0 ;i --) {
            TreeNode current = parents.get(i);
            if (isParent(current, q)) {
                return current;
            }
        }
        for (int i = 0; i < parents.size();i ++) {
            System.out.println(parents.get(i).val);
        }
        return root;
    }

    private void addParent(TreeNode root, TreeNode target, List<TreeNode> parents) {
        if (isParent(root, target)) {
            parents.add(root);
        }
        if (root == null) {
            return;
        }
        addParent(root.left, target, parents);
        addParent(root.right, target, parents);
    }

    private boolean isParent(TreeNode parent, TreeNode child) {
        if (parent == null) {
            return false;
        }
        if (parent == child) {
            return true;
        }
        return isParent(parent.left,child) || isParent(parent.right, child);
    }
}

思路2

如果有个节点是p,q的公共父节点节点,那么这个节点的子树一定包含分别包含p,q,或者说这个节点就是p,他左右子树里面包含q,或者这个节点是q他的子树包含p。

代码2

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    private TreeNode ans;
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        dfs(root, p, q);
        return ans;
    }
    private boolean dfs(TreeNode root, TreeNode p, TreeNode q) {
        if (root == null) {
            return false;
        }
        boolean lson = dfs(root.left, p, q); //是pq是否有个在左子树里面
        boolean rson = dfs(root.right, p, q); //pq是否有个在右子树里面
        if (lson && rson || (root.val == p.val || root.val == q.val) && (lson || rson)) {
            ans = root;
        }
        return lson || rson || (root.val == p.val || root.val == q.val); // 如果满足都在左或者都在右就是root是pq的公共子节点,不满足 lson || rson 要考虑一种特殊的情况,就是p是q的父节点。即p为Root

    }
}

题目: 二叉搜索树的公共父节点。

二叉搜索树的性质,中序遍历的结果是从大到小的,也就是左子树的节点值始终比根节点小,右子树的值始终是比根节点的大。

/**
 * 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) {
        if (root == null) {
            return null;
        }
        if (root.val < q.val && root.val < p.val) {
            return lowestCommonAncestor(root.right, p, q );
        } else if (root.val> q.val && root.val > p.val) {
            return lowestCommonAncestor(root.left, p, q );
        }
        return root;
    }
}

标签:TreeNode,val,算法,parents,二叉树,return,root,节点
来源: https://www.cnblogs.com/lijunyzzZ/p/14225667.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有