#include<iostream>
#include<stack>
using namespace std;
struct TreeNode
{
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int _val) :val(_val),left(NULL),right(NULL) {}
};
void preOrder(TreeNode *root);
void postOrder(TreeNode *root);
void inOrder(TreeNode *root);
int main()
{
TreeNode *root = new TreeNode(1);
TreeNode*lchild= new TreeNode(2);
TreeNode*rchild = new TreeNode(3);
TreeNode*llchild = new TreeNode(4);
TreeNode*lrchild = new TreeNode(5);
root->left = lchild;
root->right = rchild;
lchild->left = llchild;
lchild->right = lrchild;
preOrder(root);
cout << endl;
postOrder(root);
cout << endl;
inOrder(root);
return 0;
}
void preOrder(TreeNode *root)
{
stack<TreeNode*>src;
src.push(root);
while (!src.empty())
{
TreeNode*tmp = src.top();
cout << tmp->val << " ";
src.pop();
if (tmp->right != NULL)
{
src.push(tmp->right);
}
if (tmp->left != NULL)
{
src.push(tmp->left);
}
}
}
void inOrder(TreeNode *root)
{
stack<TreeNode*>src;
TreeNode*tmp = root;
while (!src.empty()||tmp!=NULL)
{
while (tmp != NULL)
{
src.push(tmp);
tmp = tmp->left;
}
tmp = src.top();
src.pop();
cout << tmp->val << " ";
tmp = tmp->right;
}
}
//后序遍历的思想是 先仿照前序遍历的方法,求出逆前序遍历(先访问右孩子节点再访问左孩子节点).
//因为逆前序遍历和后序遍历的元素顺序是相反的,所以将结果保存到栈之后,输出的顺序就是后序遍历顺序*/
void postOrder(TreeNode *root)
{
stack<TreeNode*>src;
stack<TreeNode*>res;
src.push(root);
while (!src.empty())
{
TreeNode*tmp = src.top();
res.push(tmp);
src.pop();
if (tmp->left != NULL)
{
src.push(tmp->left);
}
if (tmp->right != NULL)
{
src.push(tmp->right);
}
}
while (!res.empty())
{
cout << res.top()->val << " ";
res.pop();
}
}
二叉树非递归前中后遍历
最新推荐文章于 2022-09-01 00:46:32 发布