二叉树前中后序遍历 —— DFS + BFS —— Rust 版本

1. 树的定义

use std::rc::Rc;
use std::cell::RefCell;
// 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
    }
  }
}

2. BFS

以下是二叉树前中后序遍历的 Rust 代码,利用栈实现,通过增加是否访问过的标记,能够以统一的写法实现,唯一的区别就是入栈的顺序。

2.1 前序遍历

use std::rc::Rc;
use std::cell::RefCell;
impl Solution {
    pub fn preorder_traversal(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<i32> {
        // 前序:根-左-右,入栈顺序:右-左-根
        // tuple.0 - node, tuple.1 - visited
        let mut stack: Vec<(Option<Rc<RefCell<TreeNode>>>, bool)> = vec![];
        stack.push((root, false));
        let mut ans: Vec<i32> = vec![];
        while !stack.is_empty() {
            let curr_pair = stack.pop().unwrap();
            let visited = curr_pair.1;
            if let Some(node) = curr_pair.0.clone() {
                let node = node.borrow();
                if visited {
                    ans.push(node.val);
                } else {
                    if node.right != None {
                        stack.push((node.right.clone(), false));
                    }
                    if node.left != None {
                        stack.push((node.left.clone(), false));
                    }
                    stack.push((curr_pair.0, true));
                }
                
            }
        }
        ans
    }
}

2.2 中序遍历

use std::rc::Rc;
use std::cell::RefCell;
impl Solution {
    pub fn inorder_traversal(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<i32> {
        // 中序遍历:左-根-右,入栈顺序:右-根-左
        // tuple.0 - node, tuple.1 - visite
        let mut stack: Vec<(Option<Rc<RefCell<TreeNode>>>, bool)> = vec![];
        stack.push((root, false));
        let mut ans = vec![];

        while !stack.is_empty() {
            let curr_pair = stack.pop().unwrap();
            let visited = curr_pair.1;
            if let Some(node) = curr_pair.0.clone() {
                let node = node.borrow();
                if visited {
                    ans.push(node.val);
                } else {
                    if node.right != None {
                        stack.push((node.right.clone(), false));
                    }

                    stack.push((curr_pair.0, true));

                    if node.left != None {
                        stack.push((node.left.clone(), false));
                    }
                }
            }
        }

        ans
    }
}

2.3 后序遍历

use std::rc::Rc;
use std::cell::RefCell;
impl Solution {
    pub fn postorder_traversal(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<i32> {
        // 后序遍历:左-右-根,入栈顺序:根-右-左
        // tuple.0 - node, tuple.1 - visite
        let mut stack: Vec<(Option<Rc<RefCell<TreeNode>>>, bool)> = vec![];
        stack.push((root, false));
        let mut ans: Vec<i32> = vec![];

        while !stack.is_empty() {
            let curr_pair = stack.pop().unwrap();
            let visited = curr_pair.1;
            if let Some(node) = curr_pair.0.clone() {
                let node = node.borrow();

                if visited {
                    ans.push(node.val);
                } else {
                    stack.push((curr_pair.0, true));

                    if node.right != None {
                        stack.push((node.right.clone(), false));
                    }

                    if node.left != None {
                        stack.push((node.left.clone(), false));
                    }
                }
                
            }
        }

        ans
    }
}

2.4 层次遍历

利用队列实现二叉树的层次遍历。

use std::rc::Rc;
use std::cell::RefCell;
impl Solution {
    pub fn level_order(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<Vec<i32>> {
        let mut ans: Vec<Vec<i32>> = vec![];
        use std::collections::VecDeque;
        let mut queue: VecDeque<Option<Rc<RefCell<TreeNode>>>> = VecDeque::new();
        if root != None {
            queue.push_back(root);
        }
        
        while !queue.is_empty() {
            let mut curr_level: Vec<i32> = vec![];
            for _ in 0..queue.len() {
                if let Some(node) = queue.pop_front().unwrap() {
                    let node = node.borrow();
                    curr_level.push(node.val);
                    if node.left != None {
                        queue.push_back(node.left.clone());
                    }
                    if node.right != None {
                        queue.push_back(node.right.clone());
                    }
                }
            }
            ans.push(curr_level);
        }

        ans
    }
}

3. DFS

3.1 前序遍历

use std::rc::Rc;
use std::cell::RefCell;
impl Solution {
    pub fn preorder_traversal(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<i32> {
        let mut ans = vec![];
        fn dfs(node: Option<Rc<RefCell<TreeNode>>>, arr: &mut Vec<i32>) {
            match node {
                Some(node) => {
                    let node = node.borrow();
                    arr.push(node.val);
                    dfs(node.left.clone(), arr);
                    dfs(node.right.clone(), arr);
                },
                None => return,
            }
        }
        dfs(root, &mut ans);
        ans
    }
}

3.2 中序遍历

use std::rc::Rc;
use std::cell::RefCell;
impl Solution {
    pub fn inorder_traversal(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<i32> {
        let mut ans: Vec<i32> = vec![];

        fn dfs(node: Option<Rc<RefCell<TreeNode>>>, arr: &mut Vec<i32>) {
            match node {
                Some(node) => {
                    let node = node.borrow();
                    dfs(node.left.clone(), arr);
                    arr.push(node.val);
                    dfs(node.right.clone(), arr);
                },
                Node => return,
            }
        }

        dfs(root, &mut ans);

        ans
    }
}

3.2 后序遍历

use std::rc::Rc;
use std::cell::RefCell;
impl Solution {
    pub fn postorder_traversal(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<i32> {
        let mut ans: Vec<i32> = vec![];

        fn dfs(node: Option<Rc<RefCell<TreeNode>>>, arr: &mut Vec<i32>) {
            match node {
                Some(node) => {
                    let node = node.borrow();
                    dfs(node.left.clone(), arr);
                    dfs(node.right.clone(), arr);
                    arr.push(node.val);
                },
                Node => {
                    return;
                },
            }
        }

        dfs(root, &mut ans);

        ans
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值