废话
又迎来了一次狗生辉煌(大佬思路)
不过脑子犯抽抽了
题目描述
就是中序遍历传送门
题目思路
先是递归,但我发现这个参数没法递归,就选择了迭代。看了评论区的,可以重新写一个函数递归。
然后我的迭代就是规规矩矩的把根节点入栈迭代,时间消耗有点大,看到评论区的什么颜色标记那个,其实就是设置一个标记,在第一次的时候都不输出,按照输出反序入栈,再输出。
效率杠杠的
其核心思想如下:
标记节点的状态,新节点为0,已访问的节点为1。
如果遇到的节点为0,则将其标记为1,然后将其右子节点、自身、左子节点依次入栈。
如果遇到的节点为1,则将节点的值输出。
题目代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
struct Node{
int time=0;
TreeNode* n;
};
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int>v;
stack<Node>s;
Node temp;
TreeNode* p;
temp.time=0;
temp.n=root;
s.push(temp);
while(!s.empty())
{
temp=s.top();
s.pop();
if(temp.n!=NULL)
{
if(temp.time==0)
{ p=temp.n;
temp.time=0;
temp.n=p->right;
s.push(temp);//右
temp.time=1;
temp.n=p;
s.push(temp);//根
temp.time=0;
temp.n=p->left;
s.push(temp);//左
}
if(temp.time==1)
{
v.push_back(temp.n->val);
}
}
}
return v;
}
};