二叉链表
typedef struct Node{
ElemType data;
struct Node *lchild, *rchild;
}Binode, *Bitree;
注意点:
1)已知 前序遍历序列 和 中序遍历序列,可以唯一确定一颗二叉树
2)已知 中序遍历序列和 后序遍历序列,可以唯一确定一颗二叉树
而已知 前序和后序 是不能确定一颗二叉树的
二叉树的遍历:是指从根节点出发,按照某种次序依次访问二叉树中的所有节点,使得每个节点被访问一次且仅被访问一次。
前序遍历:根-左-右
PREORDER_TRAVERSAL(T) //递归前序遍历
if T != NIL
print(T)
PREORDER_TRAVERSAL(T.leftchild)
PREORDER_TRAVERSAL(T.rightchild)
void preOrder2(Binode *root) //非递归前序遍历
{
stack<Binode*> s;
BinTree *p=root;
while(p!=NULL||!s.empty())
{
while(p!=NULL)
{
cout<<p->data<<" ";
s.push(p);
p=p->lchild;
}
if(!s.empty())
{
p=s.top();
s.pop();
p=p->rchild;
}
}
}
中序遍历:左-根-右
INORDER_TRAVERSAL(T) //递归中序遍历
if T != NIL
INORDER_TRAVERSAL(T.leftchild)
print(T)
INORDER_TRAVERSAL(T.rightchild)
void inOrder2(BinTree *root) //非递归中序遍历
{
stack<BinTree*> s;
BinTree *p=root;
while(p!=NULL||!s.empty())
{
while(p!=NULL)
{
s.push(p);
p=p->lchild;
}
if(!s.empty())
{
p=s.top();
cout<<p->data<<" ";
s.pop();
p=p->rchild;
}
}
}
后序遍历:左-右-根
postorder traversal
POSTORDER_TRAVERSAL(T)
if T != NIL
POSTORDER_TRAVERSAL(T.leftchild)
POSTORDER_TRAVERSAL(T.rightchild)
print(T)
参考:
http://www.linuxidc.com/Linux/2015-07/119765.htm
http://www.cnblogs.com/dolphin0520/archive/2011/08/25/2153720.html