1 class Solution { 2 public: 3 vector<int> inorderTraversal(TreeNode* root) { 4 stack<TreeNode*> s; 5 vector<int> val; 6 TreeNode* curr = root; 7 s.push(curr); 8 while(!s.empty()) { 9 while(curr) { 10 s.push(curr->left); 11 curr = curr->left; 12 } 13 curr = s.top(); 14 s.pop(); 15 if (curr) { 16 val.push_back(curr->val); 17 curr = curr->right; 18 if (curr) s.push(curr); 19 } 20 } 21 return val; 22 } 23 };
非递归时需要保留结点的父结点,这里使用栈
首先把该结点的所有左节点都放在栈里(8-12)
然后拿出一个结点,判断是不是空结点
不是空结点就输出,并将其右结点加入栈内
这样就保证先输出左子树,然后输出左子树的右子树,若左子树是叶子结点则为空,输出自己
然后将右结点加入栈中,重复以上过程
左右子树输出完毕时,curr总是指向空的右节点,不执行内层while
按入栈顺序对父结点操作