方法一:
先找最左孩子,只有最左孩子同时是叶子节点,才是目标节点,否则迭代最左孩子的右孩子。
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> vt;
stack<TreeNode*> st;
if(root==NULL)
return vt;
while(root!=NULL||!st.empty())
{
while(root)
{
if(!st.empty()&&st.top()==root)
break;
st.push(root);
root=root->left;
st.top()->left=NULL;
}
if(!st.empty())
{
root=st.top();
if(root->right)
{
root=root->right;
st.top()->right=NULL;
}
else
{
vt.push_back(root->val);
st.pop();
if(!st.empty())
root=st.top();
else
root=NULL;
}
}
}
return vt;
}
};方法2:后序遍历的顺序是left -right-root;现在的出栈顺序是root ,right,left。将结果翻转即可
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> vt;
stack<TreeNode*> st;
if(!root)
return vt;
st.push(root);
while(!st.empty())
{
root=st.top();
st.pop();
vt.push_back(root->val);
if(root->left)st.push(root->left);
if(root->right)st.push(root->right);
}
reverse(vt.begin(), vt.end());
return vt;
}
};
本文介绍两种实现二叉树后序遍历的方法。方法一通过寻找最左子节点来确定遍历顺序,而方法二则利用栈逆序存储节点以达到遍历目的。这两种方法各有特点,为理解后序遍历提供了不同的视角。
314

被折叠的 条评论
为什么被折叠?



