三種方法寫二叉樹的後序遍歷(遞歸+非遞歸)
思路一(遞歸):後序遍歷:根、左、右。採用棧進行存儲,遞歸的返回條件是root==NULL;相信大家都見到過這種寫法,代碼如下:
class Solution
{
public:
void postOrder(TreeNode *root,vector<int>&vec)
{
if(root != NULL)
{
postOrder(root->left,vec);
postOrder(root->right,vec);
vec.push_back(root->val);
}
}
vector<int> postorderTraversal(TreeNode *root)
{
vector<int>vec;
postOrder(root,vec);
return vec;
}
};
思路二(非遞歸):因爲我們知道先序遍歷的順序是“根、左、右”,我們可以先變成“跟、右、左”然後再利用reverse函數。代碼如下:
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
/**
*
* @param root TreeNode類
* @return int整型vector
*/
vector<int> postorderTraversal(TreeNode* root)
{
// write code here
vector<int> v;
if (!root)
return v;
stack<TreeNode*> res;
res.push(root);
while (res.size())
{
TreeNode* tmp = res.top();
res.pop();
v.push_back(tmp->val);
if (tmp->left)
res.push(tmp->left);
if (tmp->right)
res.push(tmp->right);
}
reverse(v.begin(), v.end());
return v;
}
};
思路三(非遞歸):我們也是要利用棧進行存儲節點,如果當前節點的左右都爲空,說明他就是葉子結點,把它節點的值存儲下來。如果右爲空左不爲空,那就把右壓入棧,如果左不爲空,右爲空,則把左壓入棧。代碼如下:
class Solution {
public:
/**
*
* @param root TreeNode類
* @return int整型vector
*/
vector<int> postorderTraversal(TreeNode* root)
{
vector<int> v;
if (!root)
return v;
stack<TreeNode*> s;
TreeNode* tmp = NULL;
s.push(root);
while (s.size())
{
tmp = s.top();
if (tmp->left == NULL && tmp->right == NULL)
{
v.push_back(tmp->val);
s.pop();
}
else
{
if (tmp->right != NULL)
{
s.push(tmp->right);
tmp->right = NULL;
}
if (tmp->left != NULL)
{
s.push(tmp->left);
tmp->left = NULL;
}
}
}
return v;
}
}