94. 二叉树的中序遍历
递归版本
class Solution {
public:
vector<int>res;
vector<int> inorderTraversal(TreeNode* root) {
if(root==nullptr) return res;
inorderTraversal(root->left);
res.push_back(root->val);
inorderTraversal(root->right);
return res;
}
};
循环版本
因此其处理过程如下[1]:
对于任一结点P,
1)若其左孩子不为空,则将P入栈并将P的左孩子置为当前的P,然后对当前结点P再进行相同的处理;
2)若其左孩子为空,则取栈顶元素并进行出栈操作,访问该栈顶结点,然后将当前的P置为栈顶结点的右孩子;
3)直到P为NULL并且栈为空则遍历结束
class Solution {
public:
vector<int>res;
vector<int> inorderTraversal(TreeNode* root) {
stack<TreeNode*>s;
TreeNode *p = root;
while (p!=nullptr||!s.empty())
{
while (p)
{
s.push(p);
p = p->left;
}
if (!s.empty())
{
p = s.top();
s.pop();
res.push_back(p->val);
p = p->right;
}
}
return res;
}
};
144. 二叉树的前序遍历
非递归:
处理过程如下:
对于任一结点P:
1)访问结点P,并将结点P入栈;
2)判断结点P的左孩子是否为空,若为空,则取栈顶结点并进行出栈操作,并将栈顶结点的右孩子置为当前的结点P,循环至1);若不为空,则将P的左孩子置为当前的结点P;
3)直到P为NULL并且栈为空,则遍历结束。
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int>res;
stack<TreeNode*>s;
TreeNode* p = root;
while (p!=nullptr||!s.empty())
{
while (p != nullptr)
{
res.push_back(p->val);
s.push(p);
p = p->left;
}
if (!s.empty())
{
p=s.top();
s.pop();
p = p->right;
}
}
return res;
}
};
145. 二叉树的后序遍历
非递归:
[1]https://www.cnblogs.com/dolphin0520/archive/2011/08/25/2153720.html