中序遍歷
void inOrder(BinaryTree root){
if (root){
inOrder(root->lChild);
cout << root->data << " ";
inOrder(root->rChild);
}
}
中序遍歷非遞迴遍歷
- 先掃描根結點的所有左結點,並將他們一一進棧
- 左結點全部入棧完後,彈出結點p並訪問之,p結點賦值為p的右孩子
- 重複第一步,直至全部結點遍歷完
void inOrderNotRecursive(BinaryTree root){ SqStack sq; initStack(sq); TreeNode *p = root, *node; while (p || !isEmpty(sq)){ if (p){ push(sq, p); p = p->lChild; } else{ pop(sq, node); cout << node->data << ' '; p = node->rChild; } } }
先序遍歷
void PreOrder(BinaryTree root){ if(root){ cout << root->data << " "; preOrder(root->lChild); preOrder(root->rChild); } }
先序非遞迴遍歷
coming........
後序遍歷
void PostOrder(BinaryTree root){ if(root){ PostOrder(root->lChild); PostOrder(root->rChild); cout << root->data << " "; } }
後序非遞迴遍歷
若使用堆疊實現後序遍歷的非遞迴演算法,根據後序遍歷LRN的特點,需要用輔助指標r記錄最近訪問過的結點。
void PostOrderNotRecursive(BinaryTree root){ TreeNode *p = root, *r; //r指標用於記錄最近訪問過的結點 initStack(sq); while(p || !isEmpy(sq)){ if(p){ //走向最左端 push(sq, p); p = p ->lChild; }else{ getTop(sq, p); if(p -> rChild && p -> rChild != r){ //結點右子樹存在,且未被訪問過 p = p->rChild; //轉向右 push(sq, p); p = p->lChild; //走到最左端 }else{ pop(sq, p); cout << p->data << " "; r = p; //記錄最近被訪問的結點 p = NULL; //訪問過後置空 } } }
層次遍歷
將根結點入隊,然後出隊。如果根結點有左孩子,將根結點的左孩子入隊,如果根結點有右孩子,將根結點的右孩子入隊。然後出隊,如此迴圈直至訪問完所有結點
void levelOrder(BinaryTree root){ SqQueue sq; TreeNode *node; initSqQueue(sq); enQueue(sq, root); while (!isEmpty(sq)){ deQueue(sq, node); cout << node->data << " "; if (node->lChild){ enQueue(sq, node->lChild); } if (node->rChild){ enQueue(sq, node->rChild); } } }
本作品採用《CC 協議》,轉載必須註明作者和本文連結