0101.Symmetric Tree

101. Symmetric Tree #

题目 #

Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).

For example, this binary tree [1,2,2,3,4,4,3] is symmetric:


    1
   / \
  2   2
 / \ / \
3  4 4  3

But the following [1,2,2,null,3,null,3] is not:


    1
   / \
  2   2
   \   \
   3    3

代码 #

use std::rc::Rc;
use std::cell::RefCell;
impl Solution {
    pub fn is_symmetric(root: Option<Rc<RefCell<TreeNode>>>) -> bool {

        let root = root.unwrap();
        let root_ref = root.borrow_mut();

        return Self::is_subtree_symmetric(root_ref.left.clone(), root_ref.right.clone());
    }

    fn is_subtree_symmetric(left: Option<Rc<RefCell<TreeNode>>>, right: Option<Rc<RefCell<TreeNode>>>) -> bool {
        if left == None && right == None {
            return true;
        }
        
        if left == None || right == None {
            return false;
        }
        
        let left = left.unwrap();
        let right = right.unwrap();

        let left_ref = left.borrow_mut();
        let right_ref = right.borrow_mut();
    
    
        if (left_ref.right == None && right_ref.left != None) || (left_ref.right != None && right_ref.left == None) {
            return false;
        }
    
        if (left_ref.left == None && right_ref.right != None) || (left_ref.left != None && right_ref.right == None) {
            return false;
        }
    
        return (left_ref.val == right_ref.val) && (Self::is_subtree_symmetric(left_ref.left.clone(), right_ref.right.clone())) && (Self::is_subtree_symmetric(left_ref.right.clone(), right_ref.left.clone()));
    }
    
}