前序遍历
前序遍历(DLR)
前序遍历也叫做先根遍历、先序遍历,可记做根左右。
前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。
若二叉树为空则结束返回,否则:
(1)访问根结点。
(2)前序遍历左子树。
(3)前序遍历右子树 。
需要注意的是:遍历左右子树时仍然采用前序遍历方法。
如右图所示二叉树
前序遍历,也叫先根遍历,遍历的顺序是,根,左子树,右子树
遍历结果:ABDECF
中序遍历,也叫中根遍历,顺序是 左子树,根,右子树
遍历结果:DBEAFC
后序遍历,也叫后根遍历,遍历顺序,左子树,右子树,根
遍历结果:DEBFCA
编辑本段程序实现
树的遍历一般都用递归实现,比较方便
C语言版本
树中节点结构为:
typedef struct TreeNode
{
int data;
TreeNode * left;
TreeNode * right;
TreeNode * parent;
}TreeNode;
void pre_order(TreeNode* Node)
{
if(Node != NULL)
{
printf("%d ",Node->data);
pre_order(Node->left);
pre_order(Node->right);
}
}
调用时: pre_order(Root); //Root为树的根
从 <http://baike.baidu.com/view/1455146.htm> 插入
中序遍历
中序遍历(LDR)
中序遍历也叫做中根遍历,可记做左根右。
中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。在遍历左、右子树时,仍然先遍历左子树,再访问根结点,最后遍历右子树。即:
若二叉树为空则结束返回,
否则:
(1)中序遍历左子树。
(2)访问根结点。
(3)中序遍历右子树。
注意的是:遍历左右子树时仍然采用中序遍历方法。
即左子树(B D E)还是左边开始(D),然后是(B),再是右边(E),完后经过(A),接着右子树(C F) 还是左边开始(F),再是中间(C),
即顺序是DBEAFC
中序遍历的时间复杂度为:O(n)。
如果一颗二叉排序树的节点值是数值,中序遍历的结果为升序排列的数组。可以利用该性质检测一棵树是否为二叉排序数。
编辑本段程序实现
c++版本
树中节点结构为:
typedef struct TreeNode
{
int data;
TreeNode * left;
TreeNode * right;
TreeNode * parent;
}TreeNode;
voidmiddle_order(TreeNode * Node)
{
if(Node != NULL)
{
middle_order(Node->left);
printf("%d ",Node->data);
middle_order(Node->right);
}
}
调用时: middle_order(Root); //Root为树的根
Java版本
class TreeNode{
public int data;
public TreeNodeleftChild;
public TreeNoderightChild;
public static voidinOrderTraversal(TreeNode node){
if(node == null){
return;
}else{
inOrderTraversal(node.leftChild);
System.out.println(node.data);
inOrderTRaversal(node.rightChild);
}
}
}
从 <http://baike.baidu.com/view/1455143.htm> 插入
后序遍历
求助编辑百科名片
后序遍历是二叉树遍历的一种。后序遍历指在访问根结点、遍历左子树与遍历右子树三者中,首先遍历左子树,然后遍历右子树,最后遍历访问根结点,在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后遍历根结点。后序遍历有递归算法和非递归算法两种。
目录
递归算法
非递归算法
编辑本段递归算法
算法描述:
(1)若二叉树为空,结束
(2)后序遍历左子树
(3)后序遍历右子树
(4)访问根结点
遍历结果:DEBFCA
伪代码
PROCEDURE POSTRAV(BT)
IF BT<>0 THEN
{
POSTRAV(L(BT))
POSTRAV(R(BT))
OUTPUT V(BT)
}
RETURN
c语言描述
struct btnode
{
int d;
struct btnode *lchild;
struct btnode *rchild;
};
void postrav(structbtnode *bt)
{
if(bt!=NULL)
{
postrav(bt->lchild);
postrav(bt->rchild);
printf("%d",bt->d);
}
}
编辑本段非递归算法
算法1(c语言描述):
void postrav1(structbtnode *bt)
{
struct btnode *p;
struct
{
struct btnode *pt;
int tag;
}st[MaxSize];
}
int top=-1;
top++;
st[top].pt=bt;
st[top].tag=1;
while(top>-1) /*栈不为空*/
{
if(st[top].tag==1)/*不能直接访问的情况*/
{
p=st[top].pt;
top--;
if(p!=NULL)
{
top++; /*根结点*/
st[top].pt=p;
st[top].tag=0;
top++; /*右孩子结点*/
st[top].pt=p->p->rchild;
st[top].tag=1;
top++; /*左孩子结点*/
st[top].pt=p->lchild;
st[top].tag=1;
}
}
if(st[top].tag==0)/*直接访问的情况*/
{
printf("%d",st[top].pt->d);
top--;
}
}
}
算法2:
void postrav2(structbtnode *bt)
{
struct btnode*st[MaxSize],*p;
int flag,top=-1;
if(bt!=NULL)
{
do
{
while(bt!=NULL)
{
top++;
st[top]=bt;
bt=bt->lchild;
}
p=NULL;
flag=1;
while(top!=-1&& flag)
{
bt=st[top];
if(bt->rchild==p)
{
printf("%d",bt->d);
top--;
p=bt;
}
else
{
bt=bt->rchild;
flag=0;
}
}
}while(top!=-1)
printf("\n");
}
}