链式存储结构
typedef struct BitNode
{
Elemtype data;
struct BitNode *lchild,*rchild;
}BitNode,*BiTree;
二叉树遍历
void preOrder(BiTree T) //先序遍历
{
if(T!=NULL)
{
visit(T); //1
preOrder(T->lchild); //2
preOrder(T->rchild); //3
}
}
中序遍历:213 后序遍历:231
三种遍历算法每个结点仅访问一次,时间复杂度为,递归工作栈的深度恰好为树的深度,最坏情况下二叉树有n个结点并且深度为n(相当于一条链下来),此时的空间复杂度为
中序遍历非递归形式
void InOrder(BiTree T)
{
stack<BiTree>s;
BiTree p=T;
while(p||!s.empty())
{
if(p)
{
s.push(p);
p=p->lchild;
}
else
{
p=s.top();
s.pop();
cout<<p->data<<endl;
p=p->rchild;
}
}
}
层次遍历
void levelOrder(BiTree T)
{
queue<BiTree>q;
BiTree p;
q.push(T);
while(!q.empty())
{
p=q.front();
q.pop();
cout<<p->data<<endl;
if(p->lchild!=NULL)
q.push(p->lchild);
if(p->rchild!=NULL)
q.push(p->rchild);
}
}
可以唯一确定一棵二叉树的遍历有:
- 先序+中序
- 后序+中序
- 层次+中序
如果只知道先序和后序,则无法唯一确定一棵二叉树