C语言 按序遍历迭代二叉查找树

8xiog9wr  于 2023-06-21  发布在  其他
关注(0)|答案(1)|浏览(106)

我这样定义了pre order:

void pre_order(binary_tree_t* root) { //D<root>L<left>R<right>
  if (root) {
    printf("%d ", root->data);
    pre_order(root->left);
    pre_order(root->right);
  }
}

发现迭代算法很难

void in_order(binary_tree_t* root) { //L<left>D<root>R<right> -- inorder -- gives sorted list
  if (root) {
    in_order(root->left);
    display_element(root->data);
    in_order(root->right);
  }
}
void iter_in_order(binary_tree_t* root) {//L<left>D<root>R<right>
  stack_t *s = create_stack(size_binary_tree(root)+1)
  push(s, root)
  while (!is_empty_stack(s)) {
    push(s, root->left);
    root = pop(s);
    display_element(root->data);
    push(s, root->right);
  }
}

你能帮助阐明这可能是如何做到的吗?

5m1hhzi4

5m1hhzi41#

当开始遍历时,应该首先将路径上的所有节点推到最左边的节点--因为这是您希望首先输出的节点。在循环中,您将立即弹出一个节点并打印它。然后,只有当正确的子节点存在时才推送该子节点。如果它存在,就像一开始一样处理它:遍历到它的最左边的decendent,并推动这些节点。
下面是你的更新代码:

void iter_in_order(binary_tree_t* root) {
  stack_t *s = create_stack(size_binary_tree(root)+1);
  push(s, root);
  while (root->left) push(s, root = root->left);
  while (!is_empty_stack(s)) {
    root = pop(s);
    display_element(root->data);
    if (root->right) {
      push(s, root = root->right);
      while (root->left) push(s, root = root->left);
    }
  }
}

相关问题