结点类型
struct TreeNode
{
char val;
struct TreeNode *l, *r;
TreeNode(int x) :val(x), l(nullptr), r(nullptr)
{
}
};
新建一个类,名为solution,相关函数都放在这里面调用。
class solution
{
public:
//以下存放各大函数
}
首先先序创建一颗二叉树,上文写到结点类型为char。我们输入相关字母,若为空则输入#。需要注意的是,我们需要输入一个完整的先序序列,输入完成后回车即可。例如我在下图所画的那副二叉树,其完整的先序遍历就是:ABDH##I##E#J##CF#K##G##。
void create(TreeNode* &root)//先序创建二叉树
{
char ch;
cin >> ch;
if (ch == '#')
{
root = nullptr;
}
else
{
root = (TreeNode *)malloc(sizeof(TreeNode));
root->val = ch;
create(root->l);
create(root->r);
}
}
在遍历之前放上我的图片,供大家参考。
递归遍历:
先序:根节点、左节点、右节点
中序:左节点、根节点、右节点
后序:左节点、右节点、根节点
void pre(TreeNode* &root)//递归先序
{
if (root != nullptr)
{
cout << root->val << " ";
pre(root->l);
pre(root->r);
}
}
void in(TreeNode* &root)//递归中序
{
if (root != nullptr)
{
in(root->l);
cout << root->val << " ";
in(root->r);
}
}
void post(TreeNode* &root)//递归后序
{
if (root != nullptr)
{
post(root->l);
post(root->r);
cout << root->val << " ";
}
}
迭代遍历:
void NLR(TreeNode* &root)//迭代先序
{
stack<TreeNode *> ret;
TreeNode *p = root;
while (p != nullptr || !ret.empty())
{
if (p != nullptr)//边遍历边打印,并存入栈中,以后需要借助这些根节点进入右子树
{
cout << p->val << " ";
ret.push(p);
p = p->l;
}
else //当p为空时,说明根和左子树都遍历完了,该进入右子树了
{
p = ret.top();//得到栈顶的根节点
ret.pop(); //出栈
p = p->r; //访问右子树
}
}
}
void LNR(TreeNode* &root)//迭代中序
{
stack<TreeNode *> ret;
TreeNode *p = root;
while (p != nullptr || !ret.empty())
{
if (p != nullptr)
{
ret.push(p);//根指针入栈
p = p->l; //遍历左子树
}
else
{
p = ret.top(); //得到栈顶结点
ret.pop(); //出栈
cout << p->val << " "; //访问根节点
p = p->r; //遍历右子树
}
}
}
void LRN(TreeNode* &root)//迭代后序
{
stack<TreeNode *> ret1, ret2;
TreeNode *p = root;
while (p != nullptr || !ret2.empty())
{
if (p != nullptr)
{
ret1.push(p);
ret2.push(p);
p = p->r;
}
else
{
p = ret2.top();
ret2.pop();
p = p->l;
}
}
while (!ret1.empty())
{
p = ret1.top();
ret1.pop();
cout << p->val << " ";
}
}
层次遍历
void level(TreeNode* &root)//层次遍历(类似于广度优先遍历)
{
queue<TreeNode *> ret;
TreeNode *p = root;
if (p != nullptr)
{
ret.push(p);
while (!ret.empty())
{
p = ret.front();
cout << p->val << " ";
ret.pop();
if (p->l != nullptr)
{
ret.push(p->l);
}
if (p->r != nullptr)
{
ret.push(p->r);
}
}
}
}
主函数中调用这些函数。
int main()//ABDH##I##E#J##CF#K##G##
{
TreeNode *root = nullptr;
solution ss;
cout << "先序输入元素创建二叉树,若元素为空则输入'#':"; ss.create(root);
cout << "递归先序:"; ss.pre(root); cout << endl;
cout << "递归中序:"; ss.in(root); cout << endl;
cout << "递归后序:"; ss.post(root); cout << endl << endl;
cout << "迭代先序:"; ss.NLR(root); cout << endl;
cout << "迭代中序:"; ss.LNR(root); cout << endl;
cout << "迭代后序:"; ss.LRN(root); cout << endl << endl;
cout << "层次遍历:"; ss.level(root); cout << endl;
_getch();
return 0;
}
最后奉上运行截图