迭代前中后序遍历二叉树
主要思想是将树先按照一定顺序扫一遍 边扫边压入栈结构即可,但是一定要注意压入顺序,一般来说越晚输出的就越先入栈。
画了两个图,忘记怎么做了就把自己画的图再跟着步骤走一遍就知道了!!!!!
先上代码:
节点结构
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
前序遍历
void preOrderUnRecur(TreeNode * head){
if(head!=nullptr){
stack<TreeNode*> myStack;
myStack.push(head);
while(!myStack.empty()){
head=myStack.top();
vc1.push_back(head->val);//cout<<head->val;
myStack.pop();
if(head->right!=nullptr)
myStack.push(head->right);
if(head->left!=nullptr)
myStack.push(head->left);
}
}
}
中序遍历
void inOrderUnRecur(TreeNode* head){
if(head!=nullptr){
stack<TreeNode*> myStack;
while(!myStack.empty()||head!=nullptr){
if(head!=nullptr){
myStack.push(head);
head=head->left;
}
else{
head=myStack.top();
myStack.pop();
vc2.push_back(head->val);//cout<<head->val;
head=head->right;
}
}
}
}
后序遍历
void posOrderUnRecur(TreeNode* head){
if(head!=nullptr){
stack<TreeNode*> s1,s2;
s1.push(head);
while(!s1.empty()){
head=s1.top();
s1.pop();
s2.push(head);
if(head->left!=nullptr){
s1.push(head->left);
}
if(head->right!=nullptr){
s1.push(head->right);
}
}
while(!s2.empty()){
vc3.push_back(s2.top()->val);//cout<<head->val
s2.pop();
}
}
}
过程
前序遍历
中序遍历
后序遍历太长了就没写
例题:
牛客的一个简单题
结果
class Solution {
public:
/**
*
* @param root TreeNode类 the root of binary tree
* @return int整型vector<vector<>>
*/
vector<vector<int> > threeOrders(TreeNode* root) {
// write code here
preOrderUnRecur(root);
inOrderUnRecur(root);
posOrderUnRecur(root);
vector<vector<int>> res;
res.push_back(vc1);
res.push_back(vc2);
res.push_back(vc3);
return res;
}
private:
vector<int> vc1;
vector<int> vc2;
vector<int> vc3;
void preOrderUnRecur(TreeNode * head){
if(head!=nullptr){
stack<TreeNode*> myStack;
myStack.push(head);
while(!myStack.empty()){
head=myStack.top();
vc1.push_back(head->val);//cout<<head->val;
myStack.pop();
if(head->right!=nullptr)
myStack.push(head->right);
if(head->left!=nullptr)
myStack.push(head->left);
}
}
}
void inOrderUnRecur(TreeNode* head){
if(head!=nullptr){
stack<TreeNode*> myStack;
while(!myStack.empty()||head!=nullptr){
if(head!=nullptr){
myStack.push(head);
head=head->left;
}
else{
head=myStack.top();
myStack.pop();
vc2.push_back(head->val);//cout<<head->val;
head=head->right;
}
}
}
}
void posOrderUnRecur(TreeNode* head){
if(head!=nullptr){
stack<TreeNode*> s1,s2;
s1.push(head);
while(!s1.empty()){
head=s1.top();
s1.pop();
s2.push(head);
if(head->left!=nullptr){
s1.push(head->left);
}
if(head->right!=nullptr){
s1.push(head->right);
}
}
while(!s2.empty()){
vc3.push_back(s2.top()->val);//cout<<head->val
s2.pop();
}
}
}
};