Description:
Given a binary tree, return the postorder traversal of its nodes’ values.
For example: Given binary tree {1,#,2,3},
return [3,2,1].
Note: Recursive solution is trivial, could you do it iteratively?
分析:
使用栈
代码:
#include <iostream>
#include <stack>
#include <vector>
#define Elementype char
using namespace std;
typedef struct TreeNode //树结点
{
Elementype val;
TreeNode *left;
TreeNode *right;
TreeNode(Elementype x) : val(x), left(nullptr), right(nullptr) {}
} *Tree;
int index = 0; //全局索引变量
//使用先序遍历创建创建二叉树
//左子树或右子树不存在用"#"表示
void MakeBinaryTree(Tree &T, Elementype value[])
{
Elementype c = value[index++];
if (c == '#')
T = nullptr;
else
{
T = new TreeNode(c);
MakeBinaryTree(T->left, value);
MakeBinaryTree(T->right, value);
}
}
//非递归先序遍历
//使用栈
vector<Elementype> BinaryTreepostorderTraversal(Tree root)
{
vector<Elementype> result;
stack<Tree> sk;
Tree p = root;
Tree pre = nullptr;
while (!sk.empty() || p != nullptr)
{
while (p) //沿左子树一直往下走
{
sk.push(p);
p = p->left;
}
p = sk.top();
//如果p没有右孩子或者其右孩子刚刚被访问过
if (p->right == nullptr || p->right == pre)
{
result.push_back(p->val);
sk.pop();
pre = p;
p = nullptr;
}
else
{
p = p->right;
}
}
return result;
}
int main()
{
Tree T = nullptr;
Elementype data[7] = {'1','#','2','3','#','#','#'}; //注意,每个结点都要有值
vector<Elementype> result;
MakeBinaryTree(T, data);
result = BinaryTreepostorderTraversal(T);
for (auto &s : result)
cout << s << " ";
cout << endl;
system("pause");
return 0;
}
测试: