zoukankan      html  css  js  c++  java
  • [JAVA]寻找最低公共祖宗结点

    题目来源:leetcode

    题目描述:

    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 p and q as the lowest node in T that has both p and q as descendants (where we allow a node to be a descendant of itself).”

    Given the following binary tree:  root = [3,5,1,6,2,0,8,null,null,7,4]

    Example 1:

    Input: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
    Output: 3
    Explanation: The LCA of nodes 5 and 1 is 3.

    一开始就决定了要用深度优先遍历,因为这样会保存他的所有祖宗结点,企图用一个栈去判断,然后发现找俩个最前面那个的前面一个不满足条件(混乱……今天阿里面试还凉了( ╯□╰ ),所以还是两个栈各自保存,他们的祖宗结点路径,也就是先序遍历,然后比较得到最最近一个共同节点。

    You are here!
    Your runtime beats 100.00 % of java submissions

     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     int val;
     5  *     TreeNode left;
     6  *     TreeNode right;
     7  *     TreeNode(int x) { val = x; }
     8  * }
     9  */
    10 class Solution {
    11     public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
    12         //bfs
    13         if(p.left==q||p.right==q) return p;
    14         if(q.left==p||q.right==p) return q;
    15         Stack<TreeNode> s1=new Stack();
    16         Stack<TreeNode> s2=new Stack();
    17         TreeNode visit=root;
    18         TreeNode r=root;
    19         while(root!=p)
    20         {
    21             if(root==null){
    22                 root=s1.peek();
    23                 if(root.right==null||root.right==visit) {  visit=root; s1.pop(); root=null;}
    24                 else{
    25                     visit=root;
    26                     root=root.right;
    27                 }
    28                 
    29             }
    30              
    31             else{
    32                 s1.push(root);
    33                 root=root.left;
    34             }
    35         }
    36         s1.push(root);
    37         root=r;
    38          while(root!=q)
    39         {
    40             if(root==null){
    41                 root=s2.peek();
    42                 if(root.right==null||root.right==visit) {  visit=root; s2.pop(); root=null;}
    43                 else{
    44                     visit=root;
    45                     root=root.right;
    46                 }
    47                 
    48             } 
    49             else{
    50            
    51                 s2.push(root);
    52                 root=root.left;
    53             }
    54         }
    55         s2.push(root);
    56         root=s1.peek();
    57         while(s2.search(root)==-1) {
    58             s1.pop();
    59             root=s1.peek();
    60         }
    61         return root;
    62     }
    63 }
    64 // public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
    65     //     TreeNode pfather=findFather(root,p);
    66     //     TreeNode qfather=findFather(root,q);
    67     //     if(pfather!=qfather) return lowestCommonAncestor(root,pfather,qfather);
    68     //     return pfather;
    69     // }
    70     // public TreeNode findFather(TreeNode root, TreeNode kid)
    71     // {
    72     //     if(root==null) return null;
    73     //     if(root.left==kid||root.right==kid) return root;
    74     //     TreeNode l=findFather(root.left,kid);
    75     //     TreeNode r=findFather(root.right,kid);
    76     //     return l==null?r:l;
    77     // }空间受限
    View Code

    加油啊

    原创供学习参考使用,转载请注明出处http://www.cnblogs.com/cuphoria/ @jm_epiphany
  • 相关阅读:
    .net注册iis
    hdu 1081To The Max
    hdu 1312Red and Black
    hdu 1016Prime Ring Problem
    hdu 1159Common Subsequence
    hdu 1372Knight Moves
    hdu 1686Oulipo
    hdu 1241Oil Deposits
    hdu 1171Big Event in HDU
    hdu 4006The kth great number
  • 原文地址:https://www.cnblogs.com/cuphoria/p/10609816.html
Copyright © 2011-2022 走看看