前序
1---2---4---5---3---6---7
思想:
中左右
1.先访问左路结点
2.左路结点入栈
3.取栈中结点访问其右子树。
代码:
cpp
vector<int> preorderTraversal(TreeNode* root) {
//访问一棵树分成两个部分
//1.访问左路结点,左路节点入栈
//2.取栈中的结点访问其右子树
vector<int> v;
stack<TreeNode*> st;
TreeNode* cur = root;
while (cur || !st.empty())//cur||!st.empty()
{
while (cur)
{
v.push_back(cur->val);//访问左路结点
st.push(cur);//左路节点入栈
cur = cur->left;
}
TreeNode* Top = st.top();//取栈中的结点访问其右子树
st.pop();
cur = Top->right;
}
return v;
}
中序
4---2---5---1---6---3---7
左中右
1.将左路结点全部入栈
2.先访问栈顶节点
3.访问栈顶结点的右子树。
cpp
vector<int> inorderTraversal(TreeNode* root)
{
vector<int> v;
stack<TreeNode*> st;
TreeNode* cur = root;
while (cur || !st.empty())
{
while (cur)
{
st.push(cur);
cur = cur->left;
}
TreeNode* Top = st.top();
v.push_back(Top->val);
st.pop();
cur = Top->right;
}
return v;
}
后序
4---5---2---6---7---3---1
中左右---中右左---左右中
左右中
1.先访问右路结点
2.右路结点入栈
3.取栈中结点访问其左子树
4.最后将数组反转即可
cpp
vector<int> postorderTraversal(TreeNode* root)
{
vector<int> v;
stack<TreeNode*> st;
TreeNode* cur = root;
while (cur || !st.empty())//cur||!st.empty()
{
while (cur)
{
v.push_back(cur->val);//访问右路结点
st.push(cur);//右路节点入栈
cur = cur->right;
}
TreeNode* Top = st.top();//取栈中的结点访问其左子树
st.pop();
cur = Top->left;
}
reverse(v.begin(),v.end());
return v;
}