思考

如何根据递归函数写出相应的迭代函数?

遍历类型

  1. struct node {
  2. int value;
  3. Node *left;
  4. Node *right;
  5. };

前序遍历

递归实现

  1. void preorder_rec(BinaryTree *root) {
  2. if (!root) {
  3. return;
  4. }
  5. printf("%d\t", root->value);
  6. // handler(root->value);
  7. preorder_rec(root->left);
  8. preorder_rec(root->right);
  9. }

非递归

  1. void preorder(BinaryTree *root) {
  2. if (!root) {
  3. return;
  4. }
  5. stack<int> st;
  6. st.push(root);
  7. while(!st.empty()) {
  8. Node *temp = st.top();
  9. st.pop();
  10. printf("%d\t", temp->value);
  11. if (temp->right) {
  12. st.push(temp->right);
  13. }
  14. if (temp->left) {
  15. st.push(temp->left);
  16. }
  17. }
  18. }

中序遍历

递归实现

  1. void inorder_rec(BinaryTree *root) {
  2. if (!root) {
  3. return;
  4. }
  5. printf("%d\t", root->value);
  6. // handler(root->value);
  7. inorder_rec(root->left);
  8. inorder_rec(root->right);
  9. }

非递归

后序遍历

递归实现

非递归

层序遍历

递归实现

非递归

总结

递归模板

核心:处理节点函数放在何处

  1. void order_rec(BinaryTree *root) {
  2. if (!root) {
  3. return;
  4. }
  5. order_rec(root->left);
  6. order_rec(root->right);
  7. printf("%d\t", root->value);
  8. // handler(root->value);
  9. }

非递归模板

合理利用栈或队列实现