解题思路
从根节点开始判断:
若根节点为空,返回空。
若根节点不为空,则向左遍历,记录节点,直到左节点为空。然后出栈一次,退回上一节点,找到上一节点的右节点,继续上述步骤。最后返回记录的值。
(注释部分为原先自写的栈和方法,可能有错,仅供参考)
/**
* 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:
// struct Stack{
// vector<int> v;
// int top;
// };
// void emptyStack(Stack *S)
// {
// S->top=-1;
// }
// bool isEmptyStack(Stack *S)
// {
// if(S->top==-1) return true;
// return false;
// }
// void comeStack(Stack *S,TreeNode *root)
// {
// S->v.push_back(root->val);
// S->top++;
// }
// void goStack(Stack *S)
// {
// if(S->top!=-1) {
// S->v.pop_back();
// S->top--;
// }
// }
vector<int> preorderTraversal(TreeNode* root) {
//栈(存放的是节点)
stack<TreeNode*> S;
//数组a,用来返回遍历完的结果
vector<int> a;
//创建临时节点p,用来操作获取内容
TreeNode *p=root;
//如果根节点不存在,返回空
if(root==nullptr)
{
return a;
}
else
{
//在p和S任一不为空的情况下进行循环
while(p || !S.empty())
{
//s.push_back(p->val);
while(p)//当p不为空
{
a.push_back(p->val);//记录当前节点
S.push(p);//p入栈
p=p->left;//向左节点遍历
}
//p为空时
p=S.top();//p指向栈顶,在前一循环中p指向了p的左节点
S.pop();//出栈
p=p->right;//将p指向p的右节点,将其视为根节点,继续循环
}
return a;
}
}
};
作者:kutu1bw-i
链接:https://leetcode.cn/problems/binary-tree-preorder-traversal/solution/lei-si-dfsqi-shi-ye-shi-jiang-di-gui-guo-60cl/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。