1. 程式人生 > >嚴蔚敏-資料結構-樹的遍歷

嚴蔚敏-資料結構-樹的遍歷

  1. 前序非遞迴遍歷
PreOrderTraverse(BiTree T)
{
	InitStack(S);
	p=T;
	while (p||!StackEmpty)
	{
		if(p)
		{ 
			print(p);
			if(p->rchild)
			{
				Push(S,p->rchild);
			}
			p=p->lchild;
		}
		else
		{
			Pop(S,p)
		}
	}
	
}
  1. 中序非遞迴遍歷
InOrderTraverse(BiTree T)
{
	InitStack(S);
	p=T;
	while(p||!SatckEmpty)
	{
		if(p){ Push(S,p);  p=p->lchild;}
		else{
			Pop(S,p); 
			print(p);
			p=p->rchild;
    }

}
  1. 後序非遞迴遍歷
    對於任一結點P,將其入棧,然後沿其左子樹一直往下搜尋,直到搜尋到沒有左孩子的結點,此時該結點出現在棧頂,但是此時不能將其出棧並訪問, 因為其右孩子還為被訪問。所以接下來按照相同的規則對其右子樹進行相同的處理,當訪問完其右孩子時,該結點又出現在棧頂,此時可以將其出棧並訪問。這樣就 保證了正確的訪問順序。可以看出,在這個過程中,每個結點都兩次出現在棧頂,只有在第二次出現在棧頂時,才能訪問它。因此需要多設定一個變數標識該結點是 否是第一次出現在棧頂。
void postOrder2(BinTree *root)    //非遞迴後序遍歷
{
    stack<BTNode*> s;
    BinTree *p=root;
    BTNode *temp;
    while(p!=NULL||!s.empty())
    {
        while(p!=NULL)              //沿左子樹一直往下搜尋,直至出現沒有左子樹的結點 
        {
            BTNode *btn=(BTNode *)malloc(sizeof(BTNode));
            btn->btnode=p;
            btn->isFirst=true;
            s.push(btn);
            p=p->lchild;
        }
        if(!s.empty())
        {
            temp=s.top();
            s.pop();
            if(temp->isFirst==true)     //表示是第一次出現在棧頂 
             {
                temp->isFirst=false;
                s.push(temp);
                p=temp->btnode->rchild;    
            }
            else                        //第二次出現在棧頂 
             {
                cout<<temp->btnode->data<<" ";
                p=NULL;
            }
        }
    }    
}

三種遞迴遍歷就很簡單了

https://www.cnblogs.com/SHERO-Vae/p/5800363.html


層次遍歷:用佇列先進先出的特徵

inq(Q, T) //根節點先入隊

while(隊不空)
{
出隊
所有孩子節點入隊
列印

}