二叉树前、中、后序遍历（递归与非递归）

struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
};

TreeNode *createTree()
{
TreeNode *root;
int x;
scanf("%d", &x);
if (x == -1)
root = NULL;
else
{
root = (TreeNode *)malloc(sizeof(TreeNode));
root->val = x;
root->left = createTree();
root->right = createTree();
}
return root;
}

void PreOrder(TreeNode *root)
{
if (root == 0)
return;
printf("%d", root->val);
PreOrder(root->left);
PreOrder(root->right);
}
void InOrder(TreeNode *root)
{
if (root == 0)
return;
InOrder(root->left);
printf("%d", root->val);
InOrder(root->right);
}
void PostOrder(TreeNode *root)
{
if (root == 0)
return;
PostOrder(root->left);
PostOrder(root->right);
printf("%d", root->val);
}


void PreOrder_Nonrecursive(TreeNode *root)
{
if  (root == 0)
return;
TreeNode *p = root;
stack<TreeNode *> S;
while (!s.empty() || p)
{
while (p)
{
cout << p->val << endl;
S.push(p);
p = p->left;
}
p = S.top();
S.pop();
p = p->right;
}
}

void InOrder_Nonrecursive(TreeNode *root)
{
if (root == 0)
return;
TreeNode *p = root;
stack<TreeNode *> S;
while (!S.empty() || p)
{
while (p)
{
S.push(p);
p = p->left;
}
p = S.top();
S.pop();
cout << p->val << endl;
p = p->right;
}
}

void PostOrder_Nonrecursive1(TreeNode *root)
{
if (root == 0)
return;
TreeNode *p = root;
stack<TreeNode *> S;
TreeNode *previsited = NULL;
while (!S.empty() || p)
{
while (p)
{
S.push(p);
p = p->left;
}
p = S.top();
if (p->right == previsited || p->right == NULL)
{
cout << p->val << endl;
previsited = p;
S.pop();
p = NULL;
}
else
p = p->right;
}
} 

void PostOrder_Dualstack(TreeNode *root)
{
if (root == 0)
return;
TreeNode *p = root;
stack<TreeNode *> S1;
stack<TreeNode *> S2;
S1.push(p);
while (!S1.empty())
{
p = S1.top();
S1.pop();
S2.push(p);
if (p->left) S1.push(p->left);
if (p->right) S2.push(p->right);
}
while (!S2.empty())
{
p = S2.top();
S2.pop();
cout << p->val << endl;
}
}

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

TreeNode* create(int pre[], int in[], int l1,int r1, int l2, int r2)
{
if (l1 > r1) return NULL;
TreeNode *node = new TreeNode(pre[l1];
int l = l2;
int i = 0;
for (; l <= r2; l++, i++)
{
if (pre[l1] == in[l])
break;
}
node->left = create(pre, in, l1+1, l1+i, l2, l-1);
node->right = create(pre, in, l1+i+1, r1, l+1, r2);
return node;
}


• 本文已收录于以下专栏：

二叉树递归非递归遍历（递归前中后，非递归前中后，层次遍历，凹入打印法等）

• xiaofei__
• 2016年05月30日 21:28
• 3999

二叉树遍历（先中后序 递归和非递归+层次遍历）java代码 可直接运行

package edu.lnu.fang.BiTree;import java.util.LinkedList; import java.util.List; import java.util.Sta...
• fangchao3652
• 2016年12月03日 18:34
• 429

二叉树前中后序遍历（递归）

• uagvdu
• 2016年04月26日 09:36
• 473

数据结构 二叉树遍历之前序、中序、后序以及层次遍历实现

• susidian
• 2015年08月16日 23:38
• 718

二叉树的创建、先序、中序以及后序遍历

• zhonghua18517
• 2014年06月01日 14:11
• 1715

二叉树前中后序遍历（递归加非递归）

• u012123160
• 2015年03月22日 20:35
• 444

【数据结构】二叉树的前中后序遍历递归和非递归实现

• e_one
• 2016年01月28日 22:24
• 5845

算法题目-二叉树前中后序遍历

• lynn_Kun
• 2017年06月14日 13:46
• 268

Java实现树的遍历（前序、中序、后续（递归|非递归）、层次）

package com.zeph.bp; import java.util.LinkedList; import java.util.Queue; import java.util.Stack; ...
• BenW1988
• 2012年08月31日 20:08
• 6131

剑指offer面试题6 前序遍历&中序遍历，后序遍历&中序遍历重构二叉树

• xietingcandice
• 2015年01月10日 21:58
• 1164

举报原因： 您举报文章：二叉树前、中、后序遍历（递归与非递归） 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)