Около половины больших структур данных
Точка знаний
Рекурсивный алгоритм прост, но в целом, ее реализация не очень эффективная. Для бинарных операций обхода дерева, во время выполнения рекурсивного алгоритма может быть смоделировано в рабочем состоянии изменения стеки , чтобы получить ноны рекурсивного алгоритма.
Во- первыхи, не-рекурсивный алгоритм обход
ключа предзаказа до того нерекурсивен алгоритм является бинарным деревом: предзаказ перемещения через все левое поддерево узла, указатель , как найти корневой узел правого поддерева для фиг. двоичный
стек производства S и текущий указатель корня Ь изменений и порядка доступ каждого узла в дереве.
分析二叉树前序遍历的执行过程可以看出,在访问某结点后,应将该结点的指针保存在栈中,以便以后能通过它找到
该结点的右子树。一般情况下,在前序遍历中,设要遍历二叉树的根指针为bt,可能有两种情况:
(1)若bt!=NULL,则表明当前二叉树不为空,此时,应输出根结点bt的值并将bt保存到栈中,准备继续遍历bt的
左子树。
(2)若bt==NULL,则表明以bt为根指针的二叉树遍历完毕,并且bt是栈顶指针所指结点的左子树。若栈不为空,应根据栈顶指针所指结点找到待遍历右子树的根指针并赋予bt,以继续遍历下去:若栈为空,则表明整个二叉树遍历完毕,应结束。
Non-рекурсивный алгоритм обхода, прежде чем бинарное дерево
void PreorderTraversal( BiNode *root )//( BinTree BT )BinTree 为结构体指针,BiNode 为结构体类型
//二叉链表的根指针root
{
BiNode *bt=root,*S[MaxSize];//定义顺序栈,工作指针bt初始化
int top=-1;//初始化顺序栈
while(bt!=NULL||top!=-1)//两个条件都不成立才退出循环
{
while(bt!=NULL)//当bt不空时循环
{
printf(" %c",bt->Data);//输出bt->data
S[++top]=bt;//将指针bt保存到栈中
bt=bt->lchild;//遍历bt的左子树
}
if(top!=-1)如果栈S不空,则
{
bt=S[top--];//将栈顶元素弹出至bt
bt=bt->rchild;//准备遍历bt的右子树
}
}
}
void PreorderTraversal( BinTree BT )
{
Stack s=CreateStack();
//Push(s,BT);
BinTree now=BT;
if(now!=NULL)
Push(s,now);
while(!IsEmpty(s))
{ now=Pop(s);
printf(" %c",now->Data);
if(now->Right!=NULL)
Push(s,now->Right);
if(now->Left!=NULL)
Push(s,now->Left);
}
}
Для обхода без рекурсивного алгоритма
столкновений узел не может получить доступ к нему немедленно, но не будет толкать его до тех пор , после того, как его левая суб-обход дерева является полным, то из стека и доступ к ним в процессе обхода заказа.
void InorderTraversal( BiNode *root )//( BinTree BT )BinTree 为结构体指针,BiNode 为结构体类型
//二叉链表的根指针root
{
BiNode *bt=root,*S[MaxSize];//定义顺序栈,工作指针bt初始化
int top=-1;//初始化顺序栈
while(bt!=NULL||top!=-1)//两个条件都不成立才退出循环
{
while(bt!=NULL)//当bt不空时循环
{
S[++top]=bt;//将指针bt保存到栈中
bt=bt->lchild;//遍历bt的左子树
}
if(top!=-1)如果栈S不空,则
{
bt=S[top--];//将栈顶元素弹出至bt
printf(" %c",bt->Data);//输出bt->data
bt=bt->rchild;//准备遍历bt的右子树
}
}
}
void InorderTraversal( BinTree BT )
{ Stack s=CreateStack();
if(BT!=NULL)
Push(s,BT);
BinTree now;
while(!IsEmpty(s))
{ while(Peek(s)->Left!=NULL)
Push(s,Peek(s)->Left);
while(!IsEmpty(s))
{ now=Peek(s);
printf(" %c",now->Data);
Pop(s);
if(now->Right!=NULL)
{ Push(s,now->Right);
break;
}
}
}
}
Postorder нерекурсивных алгоритмов
, когда пройдено левое поддерево, так как траверса правого поддерева еще, так что узел тянуть стек не может найти правильный узел поддерева через стек, он готов пройти через правое поддерево: когда Пройдя через правое поддерево, вершина стека узла стека, и доступ к нему.
Для того , чтобы различать между различными узлами обработки стека, устанавливает флаг переменную флаг, флаг = 1 указывает , что левое поддерево был пройден, стек не может стека узла: флаг = 2 указывает на то, пройденный правое поддерево, узлы могут быть в верхней части стека стек и доступа. Стек тип элемента может быть определен по типу структуры языка Си
typedef struct{
BiNode *ptr;
int flag;
}ElemType;//BiNode 为结构体类型
Для перемещения бинарного дерева корневого набора указателей для BT есть следующие две ситуаций:
(1) если Ь не равен NULL, то Ь В флаге и флаг (набор к 1) в стек, так как она проходит через его левое поддерево.
(2) если Ь равно NULL, стек пуст в это время, вся итерация завершена: Если стек не пуст, в верхней части узла стека или левого поддерева правого поддерева проходится завершено. Если узел флаг ФЛАГ = 1 стека, это указывает на то, что левое поддерево узлов пересекающих стек завершается, флаг до 2, и пройти через правый стек поддерево узла: стек , если флаг флаг узла = 2, это указывает на то, что узел стека может пройти правое поддерево будет завершена, стек тянуть и выходной узел.
void PostorderTraversal(BiNode *root )
{
ElemType S[MaxSize];//定义顺序栈
int top=-1;初始化顺序栈
BiNode *bt=root;//工作指针bt初始化
while(bt!=NULL||top!=-1)//循环直到bt为空且栈S为空
{
while(bt!=NULL)
{
top++;
S[top].ptr=bt;//root连同标志flag入栈
S[top].flag=1;
bt=bt->lchild;//继续遍历bt的左子树
}
while(top!=-1&&S[top].flag==2)//注意是循环,可能连续出栈
//当栈S非空且栈顶元素的标志为2时,出栈并输出栈顶结点
{
bt=S[top--].ptr;
printf(" %c",bt->Data);
}
if(top!=-1)//当栈非空,将栈顶元素的标志改为2,准备遍历栈顶结点的右子树
{
S[top].flag=2;
bt=S[top].ptr->rchild;
}
}
}
void PostorderTraversal( BinTree BT )
{ Stack s=CreateStack();
if(BT!=NULL)
Push(s,BT);
BinTree now=BT,last=NULL;
while(!IsEmpty(s))
{ while(Peek(s)->Left!=NULL)
Push(s,Peek(s)->Left);
while(!IsEmpty(s))
{ now=Peek(s);
if(now->Right==last||now->Right==NULL)
{ printf(" %c",now->Data);
Pop(s);
last=now;
}
else
{ Push(s,now->Right);
break;
}
}
}
}
Добавьте описание ссылки
, придают большой Бог адрес блог