二叉树的先序遍历-非递归实现

class Solution {
public:
    void preorderTraversal(TreeNode* root) {
        //1.先逐个访问左路结点,并将其入栈
        //2.再访问栈顶元素的右子树
        
        stack<TreeNode*> helper;
        TreeNode* cur=root;
        //只有cur为空,并且栈空,说明所有元素访问完
        while(cur || !helper.empty())
        {
           while(cur){              //  左路结点入栈
                cout << cur->val;
                helper.push(cur);
                cur=cur->left;
           }
            //来到这左路结点已入栈
            
            TreeNode* right=helper.top()->right;//栈顶的右子树
            helper.pop();//弹出栈顶
            cur=right;//将右子树赋给cur上去继续判断(cur是当前结点的右子树,它是可能为空的,当它为空时,继续取下一个栈顶的右子树,否则要将其赋给cur,再次
            //当做关键结点,即左路结点入栈,取栈顶,访问右子树...)
        }
        return;
    }
};