具体方法:
构建两个结点,一为当前结点(current),另一个为上次访问结点(lastVisited),并构建堆栈用于存放结点。若结点不为空,则从此节点开始,遍历左子树,并将结点依此压栈。取当前结点为栈顶结点,如果当前节点的右子树为空,或是上次访问的结点(证明已经遍历此节点的左子树与右子树),则出栈,并将此节点的值存入vector中,中有再将当前结点赋予上次访问结点,当前结点置空。
.head
#ifndef C68_H
#define C68_H
#include<vector>
#include<iostream>
#include<stack>
using namespace std;
class TreeNode{
public:
int val;
TreeNode *left, *right;
TreeNode(int val)
{
this->val = val;
this->left = this->right = NULL;
}
};
class Solution {
public:
vector<int> postorderTraversal(TreeNode *root) {
// write your code here
TreeNode *current = root,*lastVisited=NULL;
stack<TreeNode*> myStack;
vector<int> res;
while (current != NULL || !myStack.empty())
{
while (current != NULL)
{
myStack.push(current);
current = current->left;
}
current = myStack.top();
if (current->right == NULL || current->right == lastVisited)
{
myStack.pop();
res.push_back(current->val);
lastVisited = current;
current = NULL;
}
else
{
current = current->right;
}
}
return res;
}
};
#endif
.cpp
#include"c68.h"
int main()
{
TreeNode *root = new TreeNode(1);
root->left = new TreeNode(2);
root->right = new TreeNode(3);
root->right->left = new TreeNode(5);
root->right->right = new TreeNode(6);
Solution s;
vector<int> v = s.postorderTraversal(root);
for (auto i : v)
cout << i << " ";
cout << endl;
return 0;
}