Нерекурсивен бинарное дерево обход

Около половины больших структур данных

Точка знаний

Рекурсивный алгоритм прост, но в целом, ее реализация не очень эффективная. Для бинарных операций обхода дерева, во время выполнения рекурсивного алгоритма может быть смоделировано в рабочем состоянии изменения стеки , чтобы получить ноны рекурсивного алгоритма.
Во- первыхи, не-рекурсивный алгоритм обход
ключа предзаказа до того нерекурсивен алгоритм является бинарным деревом: предзаказ перемещения через все левое поддерево узла, указатель , как найти корневой узел правого поддерева для фиг. двоичный
Here Вставка рисунка Описание
стек производства S и текущий указатель корня Ь изменений и порядка доступ каждого узла в дереве.
Here Вставка рисунка Описание

分析二叉树前序遍历的执行过程可以看出,在访问某结点后,应将该结点的指针保存在栈中,以便以后能通过它找到
该结点的右子树。一般情况下,在前序遍历中,设要遍历二叉树的根指针为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;            
                               }        
                }  
    }
}

Добавьте описание ссылки
, придают большой Бог адрес блог

Опубликован 46 оригинальные статьи · вона похвала 16 · просмотров 9455

рекомендация

отblog.csdn.net/weixin_43717681/article/details/89191772