#include <iostream>
#include <stack>
using namespace std;
struct TreeNode{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x): val(x), left(NULL), right(NULL){}
};
/*树的遍历递归版本*/
void preOrder(TreeNode* root){
if(!root) return ;
cout << root->val << " ";
preOrder(root->left);
preOrder(root->right);
}
void inOrder(TreeNode* root){
if(!root) return ;
inOrder(root->left);
cout<< root->val << " ";
inOrder(root->right);
}
void postOrder(TreeNode* root){
if(!root) return ;
postOrder(root->left);
postOrder(root->right);
cout<< root->val <<" ";
}
/*树的遍历非递归版本*/
void preorder_iterative(TreeNode* root){
/*
1)访问当前节点P,并将节点P入栈;
2)判断P的左孩子是否空,若空则取出栈顶节点并把栈顶节点的右孩子
设为当前节点P,若不空则将左孩子设为当前节点P,继续执行1);
3)直到P为NULL,并且栈空
*/
stack<TreeNode *>s;
TreeNode *p = root;
while(p != NULL || !s.empty()){
while(p != NULL){
cout<<p->val<<" ";
s.push(p);
p = p->left;
}
if(!s.empty()){
p = s.top();
s.pop();
p = p->right;
}
}
}
void inorder_iterative(TreeNode* root){
/*
1)当前节点P左孩子非空,P入栈,P的左孩子设为当前节点;
2)当前节点P左孩子空,访问栈顶元素并出栈,栈顶的右孩子设为p
3)直到pNULL,并切栈空
*/
stack<TreeNode*> s;
TreeNode *p = root;
while(p != NULL || !s.empty()){
while(p != NULL){
s.push(p);
p = p->left;
}
if(!s.empty()){
p = s.top();
cout<<p->val<<endl;
s.pop();
p = p->right;
}
}
}
void postorder_interative(TreeNode* root){
/*
1)叶子节点直接访问
2)左右孩子访问过了也直接访问(p->right==NULL&&pre==p->left)||pre==p->right
3)右孩子和左孩子依次入栈
*/
stack<TreeNode*> s;
TreeNode* p = root;
TreeNode* pre = root;
s.push(p);
while(!s.empty()){
p = s.top();
if((p->left==NULL&&p->right==NULL) ||
(p->right==NULL&&pre==p->left) ||
(pre==p->right)){
cout<<p->val<<endl;
pre=p;
s.pop();
}
else{
if(p->right) s.push(p->right);
if(p->left) s.push(p->left);
}
}
}
int main(){
TreeNode* root = new TreeNode(0);
root->left = new TreeNode(1);
root->right = new TreeNode(2);
root->left->left = new TreeNode(3);
//inOrder(root);
//preOrder(root);
//postOrder(root);
//preorder_iterative(root);
//inorder_iterative(root);
postorder_interative(root);
return 0;
}
C++_树的遍历
猜你喜欢
转载自blog.csdn.net/Gentlemanman/article/details/84708311
今日推荐
周排行