• [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
  • 相关阅读:
    linux系统如何发送邮件
    zabbix监测图形界面显示方框乱码解决方法
    Eclipse C++的配置问题launch failed binary not found
    Cpu表现出正弦曲线
    让cpu跑到100%的bat文件
    进程僵死
    华为一些笔试题~~~~零散总结
    数据库~~~投影与除操作
    C++连接Mysql数据库操作
    微软面试题目及答案
  • 原文地址:https://www.cnblogs.com/cuphoria/p/10609816.html
Copyright © 2020-2023  润新知