一.递归
二叉树的后序遍历过程为先遍历左子树,再遍历右子树,最后访问根节点
- 先访问根节点的左子树,3的左子树为空,则访问3的右子树5,5的左右子树都为空,访问根节点5,然后返回访问节点3
- 根节点7的左子树访问完之后,访问7的右子树,访问节点2的左子树,节点1的左右子树都为空,访问节点1,2的右子树为空,返回访问节点2
- 根节点7的右子树遍历完,最后访问根节点7
- 因此后序遍历为:5->3->1->2->7
C语言:
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
int GetSize(struct TreeNode* root)
{
if(root==NULL)
return 0;
return GetSize(root->left)+GetSize(root->right)+1;
}
void _postorderTraversal(struct TreeNode* root,int* array,int* index)
{
if(root==NULL)
return 0;
_postorderTraversal(root->left,array,index);
_postorderTraversal(root->right,array,index);
array[(*index)++]=root->val;
}
int* postorderTraversal(struct TreeNode* root, int* returnSize) {
*returnSize=GetSize(root);
int* array=(int*)malloc(sizeof(int)*(*returnSize));
int index=0;
_postorderTraversal(root,array,&index);
return array;
}
C++:
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
vector<int> v;
vector<int> postorderTraversal(TreeNode* root) {
if(root==NULL)
return v;
postorderTraversal(root->left);
postorderTraversal(root->right);
v.push_back(root->val);
return v;
}
};
二.非递归
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> v;
stack<TreeNode*> s; //新建一个栈结构
if(root==NULL)
return v;
TreeNode* prev=NULL; //用prev记录上一个访问过的节点
s.push(root);
while(!s.empty())
{
TreeNode* cur=s.top();
if((cur->left==NULL&&cur->right==NULL)||
(prev!=NULL&&(prev==cur->left||prev==cur->right))) //如果prev等于当前节点的子节点,则说明当前节点的左右节点都已经访问过
{
v.push_back(cur->val);
prev=cur; //更新prev
s.pop();
}
else
{
if(cur->right!=NULL) //如果右节点不为空,则入栈
s.push(cur->right);
if(cur->left!=NULL) //如果左节点不为空,也入栈
s.push(cur->left);
}
}
return v;
}
};