前序遍历:先遍历父节点,然后左子节点,然后右子节点。
下图的遍历顺序为:1245367
递归方式遍历:
基本思想:对一个树的访问,可以分成访问当前节点,访问左子树和访问右子树。而访问左右子树时又可以看做是上述步骤的重复,因此可以递归的调用。
代码流程:
void preOrder(TNode* root){ if (root != NULL){ Visit(root); //访问当前节点 preOrder(root->left); //递归访问左子节点 preOrder(root->right); //递归访问右子节点 } }
非递归方式遍历:
基本思想:在访问途中将依次遇到的节点保存下来。由于节点出现次序与恢复次序是反序的,因此是一个先进后出结构,需要用栈。
代码流程:
void preOrder1(TNode* root){ Stack S; while ((root != NULL) ||!S.empty()) { if (root != NULL) { Visit(root); S.push(root); // 先访问,再入栈 root = root->left; // 依次访问左子树 } else{ root = S.pop(); // 回溯至父亲节点 root = root->right; } } }
注:将代码和开始时的附图一起看,能更好的理解。