数据结构复习——二叉树的遍历
这里用到了c++ 的stl,记得加头文件
语言描述可能比较混乱时间有限,主要是自己复习用的,代码问题应该不大
二叉树结构的建立
typedef struct BiTNode
{
char data;
struct BiTNode* lchild;
struct BiTNode* rchild;
}BiTNode,*BiTree;
1.先序遍历(递归)
void PreOrderTraverse(BiTree T)
{
if(T)
{
cout<<T->data;
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
2.先序遍历(非递归)
void PreOrder(BiTree T)
{
stack<BiTNode*> s;
BiTNode *p=T;
while(p || !s.empty())
{
if(p)
{
cout<<p->data;
s.push(p);
p=p->lchild;
}
else
{
p=s.top();
s.pop();
p=p->rchild;
}
}
}
说一下先序非递归的思路:
前序遍历就是
(1)访问根节点
(2)先序访问左子树
(3)先序访问右子树
非递归的话会用到一个栈,栈的作用是存储经历过的结点,这样可以有选择性的返会上一个我们所需要返回的结点
基本过程如下;
(1)沿着左孩子依次入栈,知道左孩子为空
(2)栈顶元素出栈,返回上一层根节点
(3)访问右孩子,如果为空就重复(2),否则就重复(1)(2)
2.中序遍历(递归)
void InOrderTraverse(BiTree T)
{
if(T)
{
InOrderTraverse(T->lchild);
cout<<T->data;
InOrderTraverse(T->rchild);
}
}
4.中序遍历(非递归)
void InOrder(BiTree T)
{
stack<BiTNode*> s;
BiTNode *p=T;
while(p || !s.empty())
{
if(p)
{
s.push(p);
p=p->lchild;
}
else
{
p=s.top();
s.pop();
cout<<p->data;
p=p->rchild;
}
}
}
说一下中序非递归的思路:
中序遍历就是
(1)中序遍历访问左子树
(2)访问根节点
(3)中序遍历访问右子树
非递归的话会用到一个栈,栈的作用是存储经历过的结点,这样可以有选择性的返会上一个我们所需要返回的结点。
这里的思想其实和先序遍历很相似
基本过程如下;
(1)沿着左孩子依次入栈,知道左孩子为空。这时找到的叶子就是应该输出的
(2)栈顶元素出栈并且访问,如果右孩子为空的话,继续执行。
(3)右孩子不为空的话那,那么执行(1)操作
5.后序遍历(递归)
void PostOrderTraverse(BiTree T)
{
if(T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout<<T->data;
}
}
6.后序遍历(非递归)
void PostOrder(BiTree T)
{
stack<BiTNode*> s;
BiTNode *p=T;
BiTNode *r=NULL;//辅助指针
while(p || !s.empty())
{
if(p)
{
s.push(p);
p=p->lchild;
}
else
{
p=s.top();
if(p->rchild && p->rchild!=r)
{
p=p->rchild;
s.push(p);
p=p->lchild;
}
else
{
p=s.top();
s.pop();
cout<<p->data;
r=p;
p=NULL;
}
}
}
}
后序非递归思路:
需要一个辅助指针r
后序遍历就是:
(1)后序遍历访问左子树
(2)后序遍历访问右子树
(3)访问根节点
一样的会用到栈,然后比前面两个要复杂点
(1)沿着左孩子,依次入栈,直到左孩子为空
(2)读取栈顶元素(如果右孩子没有访问过而且不为空)那么就转到右子树执行
否则就出栈并且访问栈顶元素,返回上一层
重复执行(1)(2)
代码汇总
#include <iostream>
#include <stack>
using namespace std;
typedef struct BiTNode
{
char data;
struct BiTNode* lchild;
struct BiTNode* rchild;
}BiTNode,*BiTree;
void CreateBiTree(BiTree &T)
{
char ch;
cin>>ch;
if(ch=='#')
T=NULL;
else
{
T=new BiTNode;
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
void InOrderTraverse(BiTree T)
{
if(T)
{
InOrderTraverse(T->lchild);
cout<<T->data;
InOrderTraverse(T->rchild);
}
}
void InOrder(BiTree T)
{
stack<BiTNode*> s;
BiTNode *p=T;
while(p || !s.empty())
{
if(p)
{
s.push(p);
p=p->lchild;
}
else
{
p=s.top();
s.pop();
cout<<p->data;
p=p->rchild;
}
}
}
void PreOrderTraverse(BiTree T)
{
if(T)
{
cout<<T->data;
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
void PreOrder(BiTree T)
{
stack<BiTNode*> s;
BiTNode *p=T;
while(p || !s.empty())
{
if(p)
{
cout<<p->data;
s.push(p);
p=p->lchild;
}
else
{
p=s.top();
s.pop();
p=p->rchild;
}
}
}
void PostOrderTraverse(BiTree T)
{
if(T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout<<T->data;
}
}
void PostOrder(BiTree T)
{
stack<BiTNode*> s;
BiTNode *p=T;
BiTNode *r=NULL;//辅助指针
while(p || !s.empty())
{
if(p)
{
s.push(p);
p=p->lchild;
}
else
{
p=s.top();
if(p->rchild && p->rchild!=r)
{
p=p->rchild;
s.push(p);
p=p->lchild;
}
else
{
p=s.top();
s.pop();
cout<<p->data;
r=p;
p=NULL;
}
}
}
}
int main()
{
BiTree T=new BiTNode;
CreateBiTree(T);
PreOrderTraverse(T);
cout<<endl;
PreOrder(T);
cout<<endl;
InOrderTraverse(T);
cout<<endl;
InOrder(T);
cout<<endl;
PostOrderTraverse(T);
cout<<endl;
PostOrder(T);
return 0;
}
//测试数据
//-*a##b##c##