#![allow(dead_code, unused, unused_variables, non_snake_case)]

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

// Definition for a binary tree node.
#[derive(Debug, PartialEq, Eq)]
pub struct TreeNode {
    pub val: i32,
    pub left: Option<Rc<RefCell<TreeNode>>>,
    pub right: Option<Rc<RefCell<TreeNode>>>,
}

impl TreeNode {
    #[inline]
    pub fn new(val: i32) -> Self {
        TreeNode {
            val,
            left: None,
            right: None,
        }
    }
}

fn main() {}

struct Solution;

impl Solution {
    pub fn reverse_odd_levels(
        root: Option<Rc<RefCell<TreeNode>>>,
    ) -> Option<Rc<RefCell<TreeNode>>> {
        let mut edage = 0;
        let mut stack = vec![root.clone()];

        while !stack.is_empty() {
            if edage % 2 == 1 {
                let (mut start, mut end) = (0, stack.len() - 1);
                while start < end {
                    let l = stack.get(start).unwrap().as_ref().unwrap().borrow().val;
                    let r = stack.get(end).unwrap().as_ref().unwrap().borrow().val;

                    stack.get(start).unwrap().as_ref().unwrap().borrow_mut().val = r;
                    stack.get(end).unwrap().as_ref().unwrap().borrow_mut().val = l;

                    start += 1;
                    end -= 1;
                }
            }

            let mut new_stack = Vec::with_capacity(stack.len() * 2);
            while let Some(x) = stack.pop() {
                let left = x.as_ref().unwrap().borrow().left.clone();
                if left.is_some() {
                    new_stack.push(left);
                }
                let right = x.as_ref().unwrap().borrow().right.clone();
                if right.is_some() {
                    new_stack.push(right);
                }
            }

            stack = new_stack;

            edage += 1;
        }

        root
    }
}