参考文章:
https://www.cnblogs.com/lMonster81/p/10433807.html
https://www.cnblogs.com/qjmnong/p/9135386.html
其中第二篇讲到了栈的具体操作,很详细。
递归
先讲递归吧,因为递归的算法比较简单,代码很类似,只不过顺序不同罢了。
前序遍历:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
if(root == NULL)
return res;
res.push_back(root->val);
preorderTraversal(root->left);
preorderTraversal(root->right);
return res;
}
private:
vector<int> res;
};
中序遍历:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
if(root == NULL)
return res;
inorderTraversal(root->left);
res.push_back(root->val);
inorderTraversal(root->right);
return res;
}
private:
vector<int> res;
};
后序遍历:
这个建议可以自己写一下,不难,参考前面的操作。
迭代
前序遍历:
一开始参考第二篇文章,提交时老是出现 “ void value not ignored as it ought to be ” 的错误。查了好久才发现,无论是vector容器的pop_back()方法也好,stack容器的pop()方法也好,返回值都是void类型的。而我试图将它们赋值给TreeNode指针,即
node = s.pop();
或者 node = v.pop_back();
因此出错,使用top()方法获取栈顶,再pop(),就没有问题了。代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
if(root == NULL)
return rsul;
stack<TreeNode*> temp;
TreeNode* node = root;
temp.push(root);
while( !temp.empty() ){
node = temp.top();//stack的pop()和vector的pop_back()的返回值都是void不能赋值,只能使用top()获取栈顶元素
temp.pop();
rsul.push_back(node->val);
if(node->right != NULL)
temp.push(node->right);
if(node->left != NULL)
temp.push(node->left);
}
return rsul;
}
private:
vector<int> rsul;
};
中序遍历
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
if(root == NULL)
return res;
TreeNode* node = root;
stack<TreeNode*> s;
while(!s.empty() || node != NULL){
while(node != NULL){
s.push(node);
node = node->left;
}
if(!s.empty()){
node = s.top();
s.pop();
res.push_back(node->val);
node = node->right;
}
}
return res;
}
private:
vector<int> res;
};
后序遍历
注意:后序遍历最后需要翻转vector容器,才能得到正确结果。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
if(root == NULL) return res;
stack<TreeNode*> s;
TreeNode* node = root;
s.push(root);
while(!s.empty()){
node = s.top();
s.pop();
res.push_back(node->val);
if(node->left != NULL)
s.push(node->left);
if(node->right != NULL)
s.push(node->right);
}
reverse(res.begin(), res.end());
return res;
}
private:
vector<int> res;
};
THE END