樹的前、中、後序遍歷演算法(遞迴與非遞迴)、層序遍歷
阿新 • • 發佈:2018-11-07
二叉樹層次遍歷 非遞迴
void LevelOrder(Tree* T) { if(T == nullptr) return ; queue<Tree *> myqueue; myqueue.push(T); while(!myqueue.empty()) { Tree *tmp = myqueue.front(); if(tmp->leftChild != nullptr) myqueue.push(tmp->leftChild); if(tmp->rightChild != nullptr) myqueue.push(tmp->rightChild); cout << tmp.val<<" "; myqueue.pop(); } }
二叉樹前序遍歷 遞迴 與非遞迴
//遞迴 void PreOrder(Tree* T) { if(T == nullptr) return ; cout << T.val << " "; PreOrder(T->leftChild); PreOrder(T->rightChild); } //非遞迴 void preOrderF(Tree * root) { if(root == nullptr) return ; stack<Tree *>s; s.push(root); Tree *p = nullptr; while(!s.empty()) { p = s.top(); s.pop(); cout << p->data << " "; if( p->right) s.push(p->right); if(p->left) s.push(p->left); } }
二叉樹中序遍歷 遞迴與非遞迴
//遞迴 void InOrder(Tree *T) { if(T == nullptr) return ; InOrder(T->leftChild); cout << T.val << " "; InOrder(T->rightChild); } //非遞迴 void InOrderT(Tree *root){ if(root == nullptr) return ; stack<Tree *>s; Tree *p = root; while(p != nullptr || !s.empty()) { if(p != nullptr) { s.push(p); p = p->left; } else{ p = s.top(); s.pop(); cout << p->data << " "; p = p->right; } } }
二叉樹後序遍歷 遞迴與非遞迴
//遞迴
void PostOrder(Tree* T)
{
if(T == nullptr)
return ;
PostOrder(T->leftChild);
PostOrder(T->rightChild);
cout << T.val << " ";
}
//非遞迴
void PostOrderT(Tree *root){
if(root == nullptr)
return ;
stack<Tree *> s;
vector<int> rs;
s.push(root);
Tree *p =nullptr;
while(!s.empty())
{
p = s.top();
s.pop();;
rs.insert(rs.begin(),p->data);
if(p->left)
s.push(p->left);
if(p->right)
s.push(p->right);
}
for(int i = 0; i < rs.size(); i++)
cout << rs[i] << " ";
}