LeetCode---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]
.
Note: Recursive solution is trivial, could you do it iteratively?
先说递归遍历:void PostOrderTraverse(BiTree *root)
{
if(!root )
{
return;
}
PostOrderTraverse(root->lchild);
PostOrderTraverse(root->rchild);
cout<<root->data<<endl;
}
递归的好处就是代码看着简洁清楚,但是理解和调试什么的都很费劲。而且由于频繁的入栈出栈,时间效率也不高。
本题中的非递归遍历
class Solution {
public:
vector<int> postorderTraversal(TreeNode *root) {
vector<int>output;
vector<TreeNode*>storage;
output.clear();
storage.clear();
if (root == NULL)
{
return output;
}
storage.push_back(root);
TreeNode* temp = NULL;
while (storage.size() > 0)
{
temp = storage.back();
if (temp->left == NULL && temp->right == NULL)
{
output.push_back(temp->val);
storage.pop_back();
}
else
{
if (temp->right)
{
storage.push_back(temp->right);
temp->right = NULL;
}
if (temp->left)
{
storage.push_back(temp->left);
temp->left = NULL;
}
}
}
return output;
}
};
主要有以下几点:
(1)如果树为空直接输出。
(2)将根节点放入到临时存储的栈中,此处用了Vector,效果一样。
(3)获取栈顶元素,判断该节点的左右孩子,如果都为空,则将该节点放入到结果栈,然后将该节点出栈。
(4)如果该节点的右孩子不为空,则将该节点的右孩子入栈,同时将该节点的右孩子指针置为空。
(5)然后判断该节点的左孩子不为空,则将该节点的左孩子入栈,同时将该节点的左孩子置为空。
(6)处理完所有节点,临时存储栈为空,输出结果。