首先定义二叉树的结构
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
1. 先序遍历
先序遍历,先访问根节点,再访问左子树,最后是右子树。
因此如果是递归方法,coding变得极其简单,如下:
void preTraversal(TreeNode* root, vector<int>& ans)
{
if (root==null) return;
ans.push_back(root->val);
if(root->left)
preTravesal(root->left);
if(root->right)
preTravesal(root->right);
}
非递归,即迭代版本,需要借助栈来帮助我们寻找下一个节点。具体操作步骤为:
从根节点开始,每次迭代弹出当前栈顶元素,并将其孩子节点压入栈中,先压右孩子再压左孩子
void preTraversal(TreeNode* root, vector<int>& ans)
{
if(root==NULL) return;
stack<TreeNode*> stack1;
vector<int> ans;
stack1.push(root);
while(!stack1.empty())
{
TreeNode* temp=stack1.top();
stack1.pop();
ans.push_back(temp->val);
if(root->right)
stack1.push(root->right);
if(root->left)
stack1.push(root->left);
}
}
2. 中序遍历
中序遍历,先访问左子树,再访问根节点,最后访问右子树。
使用递归方法,coding依旧是超级简单。
void inorderTraversal(TreeNode* root, vector<int>& ans)
{
if (root==null) return;
if(root->left)
preTravesal(root->left);
ans.push_back(root->val);
if(root->right)
preTravesal(root->right);
}
迭代版本,借助辅助栈完成相关操作。
主要思路,沿着左子树不断延伸,直至到左叶子节点,遍历过程中记录中间节点,到底以后,出栈,同时开始指向右子树,将右子树入栈。
void inorderTraversal(TreeNode* root, vector<int>& ans)
{
stack<TreeNode*> stack1;
vector<int> ans;
if (root==NULL) return ans;
while(!stack1.empty() || root)
{
while(root)
{
stack1.push(root);
root=root->left;
}
TreeNode* temp=stack1.top();
ans.push_back(temp->val);
stack1.pop();
root=temp->right;
}
}
3. 后序遍历
递归版本比较简单,调整一下输出顺序即可。coding如下:
void postTraversal(TreeNode* root, vector<int>& ans)
{
if (root==null) return;
if(root->left)
preTravesal(root->left);
if(root->right)
preTravesal(root->right);
ans.push_back(root->val);
}
迭代版本,借助了先序遍历的思想。后序遍历中是从下往上,从左往右,因此只需要改为从上往下,先进左再进右之后,再逆序即可。
void postTraversal(TreeNode* root, vector<int>& ans)
{
if (root==NULL) return;
stack<TreeNode*> stack1,stack2;
vector<int> ans;
stack1.push(root);
while(!stack1.empty())
{
root=stack1.top();
stack2.push(root);
stack1.pop();
if(root->left)
stack1.push(root->left);
if(root->right)
stack1.push(root->right);
}
while(!stack2.empty())
{
root=stack2.top();
ans.push_back(root->val);
stack2.pop();
}
}