【递归】
二叉树的中序遍历的顺序是先输出左孩子,然后输出根节点,再输出右孩子。
那我们可以将一颗二叉树的左右子树分别当作他的左右孩子,然后进行递归,当遇
到空指针的时候则是递归出口。
【代码实现】
#include<iostream>
using namespace std;
struct BinTree
{
char data;
struct BinTree *left ,*right ;
};
void inOrderTraversal(BinTree *root)//中序遍历
{
if(root == NULL){return;}
inOrderTraversal(root->left);
cout<<root->data<<' ';
inOrderTraversal(root->right);
}
【非递归】
因为在中序遍历中,根结点在左孩子后遍历,所以我们先将指针一直向左,并记录经过的结点
如果当前结点无左结点,就回退到上一结点,并检测其是否有右结点,如果有就压入栈中,再
次向左执行相同操作,代码如下
【代码实现】
#include<iostream>
#include<stack>
using namespace std;
struct BinTree
{
char data;
struct BinTree *left ,*right ;
};
void inOrderTraversal2(BinTree *root)//中序遍历迭代
{
stack<BinTree*> res;
BinTree *cur = root;
while(cur||!res.empty())
{
while(cur)
{
res.push(cur);
cur = cur->left;
}
BinTree *p;
p = res.top();
res.pop();
cout<<p->data<<' ';
cur = p->right;
}
}