二叉树的遍历是学习二叉树最基本却极为重要的一环。当你熟练掌握二叉树的遍历之后,你会发现很多题目都是建立在遍历的基础上来解决的。本文章就是为了盘点一下各种遍历算法的原理和实现。
前序遍历
前序遍历也叫先序遍历(preorder),整个操作过程比较简单,先访问根结点,在访问左子树,左子树访问完之后访问右子树。
- 若二叉树为空,则什么也不做
- 否则:
2.1 访问根结点
2.2. 先序遍历左子树
2.3. 先序遍历右子树
递归实现
void preOrder(BinTree* BT){
if(BT){
printf("%d ", BT->data);
preOrder(BT->left);
preOrder(BT->right);
}
}
非递归实现
void preOrder(TreeNode* root){
if(root == NULL) return;
stack<TreeNode*> S; // 初始化栈
TreeNode* node = root; // 声明遍历指针
while(node || !S.empty()){
if(node != NULL)}{
// 不断访问树的根节点,并且存储左子树(若存在的话)
cout << node->val << " ";
S.push(node);
node = node->left;
}
else{
// 遇到空指针,访问栈顶指针指向的右子树结点
node = S.top()->right;