LeetCode Algorithm部分.145
【145】Binary Tree Postorder Traversal
Given a binary tree, return the postorder traversal of its nodes’ values.
For example:
Given binary tree {1,#,2,3},1
\
2
/
3
return [3,2,1].
本题的意思是后序遍历二叉树。所谓遍历(Traversal)就是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。而后序遍历则是访问根结点的操作发生在遍历其左右子树之后。
本文将给出通过C++实现两种常见的后序遍历的方法。
按照题目给出二叉树的数据结构
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
1.递归
如果通过递归的话比较简单,按照后序遍历的定义即可。具体代码如下
void postorder(TreeNode *root, vector<int>& res){
if(root != NULL){
postorder(root->left, res);
postorder(root->right, res);
res.push_back(root->val);
}
}
vector<int> postorderTraversal(TreeNode *root)//原题给出
{
vector<int> res;
postorder(root, res);
return res;
}
然而题目里Note所说,用递归是毫无意义的(太简单了,而且浪费空间),所以下面用迭代的方式
2.迭代
这里用一张图来分析一下
![]()
此图来自http://blog.youkuaiyun.com/fansongy/article/details/6798278/
我通过用一个栈来储存节点,下面是我的代码
vector<int> postorderTraversal(TreeNode *root)
{
vector<int> res;
if(root == NULL) return res;//如果树为空的话返回一个空向量
stack<TreeNode *> stackOfT;//用于储存节点
TreeNode *tem = root;//用于记录目前正进行判断的节点
TreeNode *last = root;//用于记录最近一次访问过的节点
stackOfT.push(tem);
while (!stackOfT.empty())
{
tem = stackOfT.top();//顶端的节点为目前要判断的节点
if( (tem->left == NULL && tem->right == NULL) || (tem->right == NULL && last == tem->left) || (last == tem->right) )
{
res.push_back(tem->val);
last = tem;
stackOfT.pop();
}//判断是否访问该节点:1.为叶子节点 2. 右子节点为空且左子节点已访问 3.右子节点已访问。 若符合上者条件之一即访问该节点,将其元素加入向量中,将其标记为最近一次访问的节点,将该节点从栈中剔除。
else
{
if(tem->right != NULL) stackOfT.push(tem->right);
if(tem->left != NULL) stackOfT.push(tem->left);
}//否则,向栈中压入节点,先压右节点,后压左节点,这样在后来访问时便可以按先左后右的顺序。
}
return res;
}
以上是我对这道题的解答,如若有不足之处请多指出。