144. 二叉树的前序遍历
题目链接:144. 二叉树的前序遍历
前序遍历思路–迭代
- 前序遍历是中左右,每次先处理的是中间节点,
- 那么先将根节点放?栈中,然后将右子树加?栈,再加?左左子树。
- 为什么要先加?右子树,再加?左子树呢?
- 因为这样出栈的时候才是中左右的顺序。
- (注意代码中空节点不?栈)
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> v;
if(root == NULL) return v;
st.push(root);
while(!st.empty())
{
TreeNode* node = st.top();
st.pop();
v.push_back(node->val);
if(node->right) st.push(node->right);
if(node->left) st.push(node->left);
}
return v;
}
};
94. 二叉树的中序遍历
题目链接:94. 二叉树的中序遍历
前序遍历思路–迭代
在使?迭代法写中序遍历,就需要借?指针的遍历来帮助访问节点,栈则?来处理节点上的元素
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> v;
TreeNode* cur =root;
if(root ==NULL) return v;
while(cur!=NULL || !st.empty())
{
if(cur !=NULL)
{
st.push(cur);
cur = cur->left;
}
else
{
cur = st.top();
st.pop();
v.push_back(cur->val);
cur = cur->right;
}
}
return v;
}
};
145. 二叉树的后序遍历
题目链接: 145. 二叉树的后序遍历
后序遍历思路–迭代
前序遍历是中左右:后序遍历是左右中,我们可以先访问中,再入左,再入右,这样出栈就是先右左,访问就是中右左,再反转数组即可:左右中; 其实就是前序遍历的时候,调整了入栈的顺序,同时再反转数组就是后序遍历了!
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> v;
if(root == NULL) return v;
st.push(root);
while(!st.empty())
{
TreeNode* node = st.top();
st.pop();
v.push_back(node->val);
if(node->left) st.push(node->left);
if(node->right) st.push(node->right);
}
reverse(v.begin(),v.end());
return v;
}
};
|