2022-05-22:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 pq,最近公共祖先表示为一个节点 x,满足 x 是 p

Posted 福大大架构师每日一题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022-05-22:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 pq,最近公共祖先表示为一个节点 x,满足 x 是 p相关的知识,希望对你有一定的参考价值。

2022-05-22:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。

如何时间复杂度O(N),额外空间复杂度O(1),解决最低公共祖先问题?

力扣236。二叉树的最近公共祖先。

答案2022-05-22:

莫里斯遍历。

答案用rust编写,答案有误。代码如下:

use std::cell::RefCell;
use std::rc::Rc;

fn main() 
    let mut head = Rc::new(RefCell::new(Some(TreeNode::new(3))));
    let mut left = Rc::clone(&head.borrow().as_ref().unwrap().left);
    *left.borrow_mut() = Some(TreeNode::new(5));

    let mut right = Rc::clone(&head.borrow().as_ref().unwrap().right);
    *right.borrow_mut() = Some(TreeNode::new(1));

    let mut head2 = Rc::clone(&head.borrow().as_ref().unwrap().left);
    let mut leftleft = Rc::clone(&head2.borrow().as_ref().unwrap().left);
    *leftleft.borrow_mut() = Some(TreeNode::new(6));

    let mut rightright = Rc::clone(&head2.borrow().as_ref().unwrap().right);
    *rightright.borrow_mut() = Some(TreeNode::new(2));

    let ans = lowest_common_ancestor(
        Rc::clone(&head),
        Rc::clone(&leftleft),
        Rc::clone(&rightright),
    );
    if ans.borrow().is_none() 
        println!("None");
     else 
        println!("ans = ", ans.borrow().as_ref().unwrap().val);
    

    let mut left = Rc::clone(&head.borrow().as_ref().unwrap().left);
    let mut right = Rc::clone(&head.borrow().as_ref().unwrap().right);
    println!("head = ", head.borrow().as_ref().unwrap().val);
    println!("p = ", left.borrow().as_ref().unwrap().val);
    println!("q = ", right.borrow().as_ref().unwrap().val);

    println!("---------------");
    println!("head = ", head.borrow().as_ref().unwrap().val);
    println!("left = ", left.borrow().as_ref().unwrap().val);
    println!("right = ", right.borrow().as_ref().unwrap().val);
    println!("left.left = ", leftleft.borrow().as_ref().unwrap().val);
    println!("left.right = ", rightright.borrow().as_ref().unwrap().val);


pub struct TreeNode 
    pub val: i32,
    pub left: Rc<RefCell<Option<TreeNode>>>,
    pub right: Rc<RefCell<Option<TreeNode>>>,


impl TreeNode 
    pub fn new(val: i32) -> Self 
        Self 
            val,
            left: Rc::new(RefCell::new(None)),
            right: Rc::new(RefCell::new(None)),
        
    


fn lowest_common_ancestor(
    mut head: Rc<RefCell<Option<TreeNode>>>,
    mut o1: Rc<RefCell<Option<TreeNode>>>,
    mut o2: Rc<RefCell<Option<TreeNode>>>,
) -> Rc<RefCell<Option<TreeNode>>> 
    if !find_first(
        Rc::clone(&o1.borrow().as_ref().unwrap().left),
        Rc::clone(&o1),
        Rc::clone(&o2),
    )
    .borrow()
    .is_none()
        || !find_first(
            Rc::clone(&o1.borrow().as_ref().unwrap().right),
            Rc::clone(&o1),
            Rc::clone(&o2),
        )
        .borrow()
        .is_none()
    
        return Rc::clone(&o1);
    

    if !find_first(
        Rc::clone(&o2.borrow().as_ref().unwrap().left),
        Rc::clone(&o1),
        Rc::clone(&o2),
    )
    .borrow()
    .is_none()
        || !find_first(
            Rc::clone(&o2.borrow().as_ref().unwrap().right),
            Rc::clone(&o1),
            Rc::clone(&o2),
        )
        .borrow()
        .is_none()
    
        return Rc::clone(&o1);
    
    let mut left_aim: Rc<RefCell<Option<TreeNode>>> =
        find_first(Rc::clone(&head), Rc::clone(&o1), Rc::clone(&o2));
    let mut cur: Rc<RefCell<Option<TreeNode>>> = Rc::clone(&head);
    let mut most_right: Rc<RefCell<Option<TreeNode>>> = Rc::new(RefCell::new(None));
    let mut ans: Rc<RefCell<Option<TreeNode>>> = Rc::new(RefCell::new(None));
    while cur.borrow().is_none() 
        most_right = Rc::clone(&cur.borrow().as_ref().unwrap().left);
        if !most_right.borrow().is_none() 
            while !Rc::clone(&most_right.borrow().as_ref().unwrap().right)
                .borrow()
                .is_none()
                && is_eq(
                    Rc::clone(&most_right.borrow().as_ref().unwrap().right),
                    Rc::clone(&cur),
                )
            
                let mut mostrightright = Rc::clone(&most_right.borrow().as_ref().unwrap().right);
                most_right = Rc::clone(&mostrightright);
            
            if Rc::clone(&most_right.borrow().as_ref().unwrap().right)
                .borrow()
                .is_none()
            
                let mut mostrightright = Rc::clone(&most_right.borrow().as_ref().unwrap().right);
                mostrightright = Rc::clone(&cur);
                let mut curleft = Rc::clone(&cur.borrow().as_ref().unwrap().left);
                cur = Rc::clone(&curleft);
                continue;
             else 
                let mut mostrightright = Rc::clone(&most_right.borrow().as_ref().unwrap().right);
                mostrightright = Rc::new(RefCell::new(None));
                if find_left_aim(
                    Rc::clone(&cur.borrow().as_ref().unwrap().left),
                    Rc::clone(&left_aim),
                ) 
                    if ans.borrow().is_none()
                        && !find_first(
                            Rc::clone(&left_aim.borrow().as_ref().unwrap().right),
                            Rc::clone(&o1),
                            Rc::clone(&o2),
                        )
                        .borrow()
                        .is_none()
                    
                        ans = Rc::clone(&left_aim);
                    
                    left_aim = Rc::clone(&cur);
                
            
        
        let mut curright = Rc::clone(&cur.borrow().as_ref().unwrap().right);
        cur = Rc::clone(&curright);
    
    return if !ans.borrow().is_none() 
        ans
     else 
        if !find_first(
            Rc::clone(&left_aim.borrow().as_ref().unwrap().right),
            Rc::clone(&o1),
            Rc::clone(&o2),
        )
        .borrow()
        .is_none()
        
            Rc::clone(&left_aim)
         else 
            Rc::clone(&head)
        
    ;

fn is_eq(mut a: Rc<RefCell<Option<TreeNode>>>, mut b: Rc<RefCell<Option<TreeNode>>>) -> bool 
    if a.borrow().is_none() && b.borrow().is_none() 
        return true;
    
    if a.borrow().is_none() || b.borrow().is_none() 
        return false;
    
    return a.borrow().as_ref().unwrap().val == b.borrow().as_ref().unwrap以上是关于2022-05-22:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 pq,最近公共祖先表示为一个节点 x,满足 x 是 p的主要内容,如果未能解决你的问题,请参考以下文章

leetcode236二叉树的最近公共祖先

二叉树进阶题------最近公共祖先

二叉树进阶题------最近公共祖先

236. 二叉树的最近公共祖先[中等]

二叉树15:二叉树的最近公共祖先

372,二叉树的最近公共祖先