二叉树:
前序: 1-2-4-8-5-9-3-6-10-7 根左右
中序: 8-4-2-5-9-1-6-10-3-7 左根右
后序列: 8-4-9-5-2-10-6-7-3-1 左右根
递归实现
#include <iostream>
#include <stack>
#include <list>
#include <vector>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
TreeNode *inorder(TreeNode* root,vector<int>& res)
{
if(root!=NULL)
{
res.push_back(root->val);
inorder(root->left,res);
inorder(root->right,res);
}
else
return NULL;
return root;
}
int main()
{
TreeNode *root=&TreeNode(1);
root->left=&TreeNode(2);
root->right=&TreeNode(3);
root->left->left=&TreeNode(4);
root->left->right=&TreeNode(5);
root->right->left=&TreeNode(6);
root->right->right=&TreeNode(7);
root->left->left->left=&TreeNode(8);
root->left->right->right=&TreeNode(9);
root->right->left->right=&TreeNode(10);
vector<int> myvec;
TreeNode *outp=inorder(root,myvec);
cout<<myvec[0];
for(int i=1;i<myvec.size();i++)
cout<<" "<<myvec[i];
cout<<endl;
return 0;
}
更改18.19.20三行的顺序,即可得到前中后序
非递归实现
前序
主要思路:
利用堆栈模拟路线,数组存储前序结果。步骤如下:
while(指针不为空||堆栈不为空)
- 判断当前指针是否为空
- 如果不为空,将数据放入堆栈s,同时将值放入数组,将指针指向左儿子
- 如果为空,指针指向栈顶元素的右儿子,同时出栈
#include <iostream>
#include <stack>
#include <list>
#include <vector>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
vector<int> preorderTraversal(TreeNode* root) {
vector<int> myvec;
stack<TreeNode*> s;
TreeNode* tmp=root;
while (tmp||!s.empty())
{
if (tmp){
s.push(tmp);
myvec.push_back(tmp->val);
tmp=tmp->left;
} else{
tmp=s.top()->right;
s.pop();
}
}
return myvec;
}
int main()
{
TreeNode *root=&TreeNode(1);
root->left=&TreeNode(2);
root->right=&TreeNode(3);
root->left->left=&TreeNode(4);
root->left->right=&TreeNode(5);
root->right->left=&TreeNode(6);
root->right->right=&TreeNode(7);
root->left->left->left=&TreeNode(8);
root->left->right->right=&TreeNode(9);
root->right->left->right=&TreeNode(10);
vector<int> myvec;
myvec=preorderTraversal(root);
cout<<myvec[0];
for(int i=1;i<myvec.size();i++)
cout<<" "<<myvec[i];
cout<<endl;
return 0;
}
中序:
while条件:输入节点不为空,堆栈不为空
如果有左儿子,就一直循环往堆栈放左儿子
如果没有左儿子了,并且堆栈不为空,指针指向栈顶的元素,出栈,然后元素放入数组,
最后把指针指向栈顶元素的右儿子(左先已经出栈,跟紧接着,现在出栈右边)
vector<int> inorderTraversal(TreeNode* root) {
vector<int> myvec;
stack<TreeNode*> s;
TreeNode* tmp=root;
while (tmp||!s.empty())
{
while (tmp){
s.push(tmp);
tmp=tmp->left;
}
if (!s.empty()){
tmp=s.top();
s.pop();
myvec.push_back(tmp->val);
tmp=tmp->right;
}
}
return myvec;
}
后序遍历
二叉树的后序遍历(leetcode 145)
vector<int> postorderTraversal(TreeNode* root) {
stack<TreeNode*> s;
vector<int> retVec;
TreeNode* current = root;
TreeNode* pre = nullptr;
while(!s.empty()||current){
while(current) {
s.push(current);
current = current->left;
}
auto top = s.top();
if(top->right==nullptr||top->right==pre) {
pre = top;
retVec.push_back(top->val);
current = nullptr;
s.pop();
}
else {
current = top->right;
}
}
return retVec;
}