嚴蔚敏-資料結構-樹的遍歷
阿新 • • 發佈:2018-11-05
- 前序非遞迴遍歷
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)
}
}
}
- 中序非遞迴遍歷
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; } }
- 後序非遞迴遍歷
對於任一結點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(隊不空)
{
出隊
所有孩子節點入隊
列印
}