二叉树中序遍历的非递归算法同样可以使用栈来实现,从根结点开始,将根结点的最左结点全部压栈,当结点p不再有最左结点时,说明结点p没有左孩子,将该结点
出栈,访问结点p,然后对其右孩子做同样的处理。
二叉树中序遍历非递归算法如下:
struct TreeNode { int val; TreeNode *left; TreeNode * right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; vector<int> inorderTraversal(TreeNode* root) { vector<int> path; stack<TreeNode *> st; while (root != NULL || !st.empty()) { //root的所有左子树全部入栈 while (root != NULL) { st.push(root); root = root->left; } //st肯定不为空,并且栈顶元素的左子树已经访问或为空 root = st.top(); //出栈 st.pop(); path.push_back(root->val); //处理右子树 root = root->right; } return path; }