144. 二叉树的前序遍历
题目描述
解题思路
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res ;
traverse(root, res);
return res ;
}
void traverse(TreeNode* root, vector<int>& vec) {
if (root == NULL) return ;
vec.push_back(root->val);
traverse(root->left, vec);
traverse(root->right, vec);
}
};
递归的实现就是:每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中
递归的实质就是迭代
统一格式法
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> res ;
vector<TreeNode *> s ;
if (root != NULL) s.push_back(root);
while (!s.empty()) {
TreeNode* last = s.back();
s.pop_back();
if (last == NULL) {
TreeNode* last = s.back();
s.pop_back();
res.push_back(last->val);
} else {
s.push_back(last);
s.push_back(NULL);
if (last->right) s.push_back(last->right);
if (last->left) s.push_back(last->left);
}
}
return res ;
}
};
学习感想
为什么当时没有用rust做呢
use std::rc::Rc;
use std::cell::RefCell;
impl Solution {
pub fn preorder_traversal(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<i32> {
if let Some(r) = root {
// use std::ops::DerefMut;
// let mut ref_node: std::cell::RefMut<TreeNode> = r.borrow_mut();
// let node: &mut TreeNode = &mut ref_node;
let mut res: Vec<i32> = vec![r.borrow().val];
res.append(&mut Self::preorder_traversal(r.borrow_mut().left.take()));
res.append(&mut Self::preorder_traversal(r.borrow_mut().right.take()));
res
} else {
vec![]
}
}
}