• [leedcode 236] Lowest Common Ancestor of a Binary Tree


    Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree.

    According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes v and w as the lowest node in T that has both v and w as descendants (where we allow a node to be a descendant of itself).”

            _______3______
           /              
        ___5__          ___1__
       /              /      
       6      _2       0       8
             /  
             7   4
    

    For example, the lowest common ancestor (LCA) of nodes 5 and 1 is 3. Another example is LCA of nodes 5 and 4 is 5, since a node can be a descendant of itself according to the LCA definition.

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    public class Solution {
        List<TreeNode> list1;
        List<TreeNode> list2;
        public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
            
    /*      前序遍历二叉树,查找p和q。
            一旦找到某一节点,就将其返回,不再遍历其子树。
            若某一子树遍历完后都没有找到p或q,则返回null。
            每一次递归完成后,比较当前根节点的左右子树是否找到p或q。
            若左右子树都找到了(p和q分别在左子树和右子树中),返回当前根节点。
            若只有一个子树找到了,另一子树返回为空(p和q都在同一子树中),返回不为空的子树节点(不一定是当前根节点的子树根节点)。
            若两个子树都没找到(p和q都不在该子树中),返回左子树(实则返回null)。*/
            
            //注意此时lowestCommonAncestor函数返回值意义已经变了,代表从root起点,是否存在两个节点(之一即可)
            
            
            /*if(root==null) return null;
            if(p==root||q==root) return root;
            TreeNode left=lowestCommonAncestor(root.left,p,q);
            TreeNode right=lowestCommonAncestor(root.right,p,q);
            if(left!=null&&right!=null){
                return root;
            }
            return left!=null?left:right;*/
            
            
            //第二种方法:使用两个链表保存从根节点到指定节点的路径中遍历到的值,然后转变为求两个链表第一个不同的节点
          list1=new ArrayList<TreeNode>();
          list2=new ArrayList<TreeNode>();
          getPath(root,p,list1);
          getPath(root,q,list2);
          int i=0;
          int j=0;
          for(;i<list1.size()&&j<list2.size();i++,j++){
              if(list1.get(i)!=list2.get(j)) break;
          }
          return list1.get(i-1);
        }
        public boolean getPath(TreeNode root,TreeNode p,List<TreeNode> list){
            if(root==null) return false;
            list.add(root);
            if(root==p) return true;
            boolean isExist=false;
            isExist=getPath(root.left,p,list);
            if(!isExist){
                isExist=getPath(root.right,p,list);
               
            }
             if(!isExist){
                 list.remove(list.size()-1);
                 return false;
            }else return true;
    
            
            
        }
    }
  • 相关阅读:
    ORACLE触发器具体解释
    秒杀多线程第四篇 一个经典的多线程同步问题
    Java中Integer类的方法
    九大排序算法再总结
    删除条目时的确认对话框
    VirtualBox安装及使用说明和虚拟机安装XP系统图文教程
    J2EE之验证码实现
    教你用笔记本破解无线路由器password
    vSphere HA状况:未知配置错误解决的方法
    HDU 2504 又见GCD
  • 原文地址:https://www.cnblogs.com/qiaomu/p/4713763.html
Copyright © 2020-2023  润新知