• 【数据结构】算法 首个公共祖先 First Common Ancestor


    首个公共祖先 First Common Ancestor

    如何找出二叉树中某两个节点的第一个共同祖先。不得将其他的节点存储在另外的数据结构中。不一定是BST

    [3,4,1,6,2,9,8,null,null,7,5], p = 6, q = 2
    公共祖先就是4
    p=6,q = 5,公共祖先就是4
    p=6,q=8,公共祖先就是3
    

    思路

    因为p和q,肯定会存在于这个树中,所以会出现2种情况,
    1 左子树中有一个节点p,右子树中有一个节点q,此时的root 就是公共祖先;
    2 当前节点就是p或者q,然后左子树或者右子树中存在另一个点,此时的节点就是公共祖先。
    设计的递归方法,要在给定的root下寻找哪个节点是p,q的最近公共祖先,如果存在就返回这个节点,否则返回null。
    此时上面的2个条件就有用了。

    从root开始向下找p,q,当找到了一个目标节点p就返回其p的parent,然后在p的parent的另一个branch寻找q,如果q被发现,那么这个parent就是pq的首个公共祖先,如果在这个子树没有,就退回上层树,继续寻找。

    public class TreeNode {
            int val;
            TreeNode left;
            TreeNode right;
            TreeNode(int x) { val = x; }
        }
         
        public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
            if(root==null){
                return null;
            }
            if(root==p||root==q){
            // 
                return root;
            }
    
            TreeNode l = lowestCommonAncestor(root.left,p,q);
            TreeNode r = lowestCommonAncestor(root.right,p,q);
            if(l!=null&&r!=null){
    		//find two node in left and right
                return root;
            }
            if (l!=null&&r==null){
            //find a node in left and can not find another node in right, so l is answer
                return l;
            }
            //l ==null and r!=null so r is answer
            return r;
        }
    

    Tag

    Tree

  • 相关阅读:
    C#写的操作系统
    FPS游戏:实现狙击子弹加速
    内表的一些操作例子(工作区赋值使用了新语法)
    SAP MM模块相关透明表收集
    简单的ALV显示例子
    拼接和前导零用法
    LOOP AT GROUP语法练习
    RFC函数的初步使用同步
    excel保存时出现“请注意,您的文档的部分内容可能包含了文档检查器无法删除的个人信息”
    Abap内表
  • 原文地址:https://www.cnblogs.com/dreamtaker/p/14898355.html
Copyright © 2020-2023  润新知