- 题目
- 答
- GG
- 力扣:145. 二叉树的后序遍历
- 树节点的栈;根节点入栈,最后访问跟;往左走,根节点入栈,左子树走到空…
- 栈顶元素的右子树若存在,往右走,根节点入栈;若左右都为空,就可以访问根元素,然后栈顶元素出栈;
- 若左右不为空,重复1,2
- 再取栈顶元素,因为入栈的都是左根节点,看右边有没有…重复2,直至栈为空。
- 出栈代表此根所在的子树已经访问完毕,不需要再入栈;因此需要判断当前栈顶根的右子树是不是上一个栈顶根元素。
Show Me The Code:
- 树节点
#include#include #include using namespace std; struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode() : val(0), left(nullptr), right(nullptr) {} TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} TreeNode(int x, TreeNode* left, TreeNode* right) : val(x) , left(left) , right(right) {} };
- 解决方案:
class Solution
{
public:
vector postorderTraversal(TreeNode* root)
{
stack st;
TreeNode* prev = nullptr;
TreeNode* cur = root;
vector v;
//左子树,右子树,根
while (cur || !st.empty())
{
//左边的统统入栈
while (cur)
{
st.push(cur);
cur = cur->left;
}
//取栈顶的右子树访问
TreeNode* top = st.top();
//如果右子树也为空,且它的右边已经访问过了,就可以访问这个节点了
if (top->right==nullptr||top->right==prev)
{
v.push_back(top->val);
st.pop();
prev = top;
}
else
{
cur = top->right;//往右边走。
}
}
return v;//返回..
}
};
- 测试代码:
void Test()
{
TreeNode* node1 = new TreeNode(1);
TreeNode* node2 = new TreeNode(2);
TreeNode* node3 = new TreeNode(3);
TreeNode* node4 = new TreeNode(4);
TreeNode* node5 = new TreeNode(5);
TreeNode* node6 = new TreeNode(6);
node1->left = node4;
node1->right = node2;
node4->left = node5;
node5->right = node6;
node2->left = node3;
vector v = Solution().postorderTraversal(node1);
for (auto& i : v)
{
cout << i << " ";
}
cout <
GG
都说面对对象编程,那没有对象的我,则是在面向百度编程…



