递归的本质是将调用函数压入栈中,既然递归可以实现二叉树的遍历,那么迭代也可以实现二叉树的遍历。
因此,我们在将一个节点及其左右孩子节点压入栈中时,必须根据遍历要求调整压入顺序;同时,由于一个节点通常会同时具有根节点和孩子节点的身份,因此一个节点会被调整两次,所以我们必须对已经调整好顺序的节点作标记,以便再次在栈中访问到他的时候将他输出到结果中。
算法的时间复杂度:O(n)
算法的空间复杂度:O(h),h为树的高度,深度遍历每一层会压入一个栈;其与n的联系为:
我们通过在调整好顺序的元素后面压入一个nullptr
来标记他们;当访问栈顶元素为nullptr
时,我们就将nullptr
前面的元素弹出到结果中
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
//初始化栈和结果
vector<int> result;
stack<TreeNode*> st;</
因篇幅问题不能全部显示,请点此查看更多更全内容