题目:
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
/**
* 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:
/*******************法一::*******递归法********************************/
// // 错误1:传入的为引用
// // 错误2:这是个属于这个solution的一个成员函数,需要被调用的,位置放错了
// void preorder(TreeNode* cur,vector<int>& result)
// {
// if(cur==NULL)
// {
// return;
// }
// result.push_back(cur->val);
// preorder(cur->left,result);
// preorder(cur->right,result);
// }
// vector<int> preorderTraversal(TreeNode* root) {
// vector<int> preResult;
// preorder(root,preResult);
// return preResult;
// }
// /****************法二::*****借用栈,使用迭代法实现代码********************/
// vector<int> preorderTraversal(TreeNode* root) {
// stack<TreeNode*> st; // 注意栈中存放的是 树的节点
// vector<int> result;
// st.push(root); // 根节点入栈放在循环体外
// while(!st.empty()) // while的每次循环,都会弹出一个栈顶元素
// {
// // 中节点
// TreeNode* node = st.top(); // 临时节点,存放栈顶 的 树节点
// st.pop(); // 然后弹出去
// if(node != NULL)
// {
// result.push_back(node->val); // 若节点不为空,就取出对应元素
// }
// // 这里不懂,感觉也没走到这一步,为什么要写这句呢?
// // node 不可能等于 NULL
// else
// {
// continue;
// }
// // 加上if语句,就可以避免空节点入栈
// if(node->right != NULL)
// {
// // 右节点
// st.push(node->right);
// }
// if(node->left != NULL)
// {
// // 左节点
// st.push(node->left);
// }
// }
// return result;
// }
/***********************法三::******标记法************************/
vector<int> preorderTraversal(TreeNode* root)
{
vector<int> result;
stack<TreeNode*> st;
// 注意判断节点不为空的写法
// 正确写法: if(root != NULL)
// 错误写法: if( !root )
// 因为 条件语句的表达式必须得是可以转化为 boolean 类型的
// 大概是nullpre不支持的
if(root != NULL)
{
st.push(root);
}
// 每次进入while循环的第一步,
// 就是把栈顶元素取出来赋值给临时节点node,并且将其弹栈
while(!st.empty())
{
TreeNode* node=st.top();
// st.pop();这句pop是在if 循环里的,当不为空才弹栈
if(node != NULL)
{
// 前序遍历的顺序是 右 左 中
st.pop();
if(node->right) // 右
{
st.push(node->right);
}
if(node->left) //左
{
st.push(node->left);
}
st.push(node); // 中
st.push(NULL);
}
else
{
st.pop();
node=st.top();
st.pop();
result.push_back(node->val);
}
}
return result;
}
};
这篇博客介绍了三种不同的方法来实现二叉树的前序遍历。分别是递归法、借助栈的迭代法和标记法。递归法直接从根节点开始,先访问根节点再遍历左右子树。迭代法利用栈,先将根节点入栈,然后在循环中不断弹出节点并访问,同时将未遍历的子节点压栈。标记法则在遍历过程中使用栈来保存节点,确保正确顺序。

828

被折叠的 条评论
为什么被折叠?



