先贴递归,很简单
class Solution { public: vector<int> res; vector<int> inorderTraversal(TreeNode* root) { if(root) { inorderTraversal(root->left); res.push_back(root->val); inorderTraversal(root->right); } return res; } };
再者是自己写的迭代,用到了堆栈,主循环是进行右子树的读取,对于某一节点,判断是否存在左节点,若存在,则将当前节点压入栈中,继续向左节点迭代,直到不存在左节点。遇到该节点后,读取其节点值,存放入数组中,如果不存在右节点并且栈不为空,则不断将temp替换为栈顶的节点,并且读取节点的值,在这个过程中,若是遇见存在右子树的节点,则将temp替换为右节点,重新进入大循环。这一做法的意义在于,能够通过压栈的方式,按顺序实现二叉树的遍历。贴代码
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: vector<int> inorderTraversal(TreeNode* root) { TreeNode* temp = root; stack<TreeNode*> st; vector<int> res; if(!root) return res; while(1) { while(temp->left) { st.push(temp); temp = temp->left; } res.push_back(temp->val); while(!temp->right && !st.empty()) { temp = st.top(); st.pop(); res.push_back(temp->val); } if(!temp->right) return res; else if(temp->right) { temp = temp->right; continue; } } return res; } };