利用栈实现二叉树的非递归遍历,并求二叉树的深度、叶子节点数、两个节点的最近公共祖先以及二叉树结点的最大距离,部分参考《剑指offer》这本书,其代码如下:
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
typedef struct BiNode //定义一棵二叉树
{
char val;
struct BiNode *left;
struct BiNode *right;
BiNode(char x) :val(x), left(NULL), right(NULL){}
}BiNode,*BiTree;
void CreateBiTree(BiTree &T)//前序创建一颗二叉树
{
char c;
cin >> c;
if ('#' == c)
T=NULL;
else
{
T = (BiNode* ) malloc(sizeof(BiNode));
T->val = c;
CreateBiTree(T->left);
CreateBiTree(T->right);
}
}
//二叉树的非递归遍历(前序、中序、后序及层序)
void PreOrder(BiTree& T)//前序遍历,非递归
{
if (T == NULL)
return;
vector<BiNode*> S;
BiNode *p = T;
while (p != NULL || !S.empty())
{
while (p != NULL)
{
cout << p->val << " ";
S.push_back(p);
p = p->left;
}
if (!S.empty())
{
p = S[S.size() - 1];
S.pop_back();
p = p->right;
}
}
cout << endl;
}
void InOrder(BiTree& T)//中序遍历,非递归
{
if (T == NULL)
return;
vector<BiNode*> S;
BiNode *p = T;
while ( p != NULL || !S.empty())
{
while (p != NULL)
{
S.push_back(p);
p = p->left;
}
if (!S.empty())
{
p = S[S.size() - 1];
cout << p->val << " ";
S.pop_back();
p = p->right;
}
}
cout << endl;
}
void PostOrder(BiTree &T)//后序遍历(双栈法),非递归
{
if (T == NULL)
ret