当前位置: 首页 > 知识库问答 >
问题:

使用顺序遍历删除二叉树

长孙阳泽
2023-03-14

我正在学习如何使用Postorder遍历删除二叉树。我知道要删除一个节点,首先我们需要删除它的子节点,然后是节点本身,所以Postorder遍历最适合删除二叉树。我想使用Inorder遍历做同样的事情,一切都很好,但我不明白下面的代码是如何工作的?

#include<stdio.h>
#include<malloc.h>

struct b_tree{
    int data;
    struct b_tree *left,*right;
};

typedef struct b_tree tree;

tree* create_node(int data)
{
    struct b_tree* new_node=(tree*)malloc(sizeof(tree));
    new_node->data=data;
    new_node->left=NULL;
    new_node->right=NULL;
    return new_node;
}

void delete_tree(tree *root)
{
    if(root==NULL)
        return;
    delete_tree(root->left);
    printf("Deleting %d node.\n",root->data);
    free(root);
    delete_tree(root->right);
}

int main()
{
    tree *root=NULL;
    root=create_node(1);
    root->left=create_node(2);
    root->right=create_node(3);
    root->left->left=create_node(4);
    root->left->right=create_node(5);
    root->left->right->left=create_node(6);
    root->left->right->right=create_node(7);
    root->right->right=create_node(8);
    root->right->right->left=create_node(9);
    delete_tree(root);
    root=NULL;
    return 0;
}

共有3个答案

傅树
2023-03-14

它显示的输出是正确的,因为按顺序它首先遍历左子树,然后遍历,然后遍历右子树

您不会得到4 2 1,因为4是左子树,然后它转到root,即2,然后到2的右子树。

当它太右时,子树根变成5,它的左子树是6。然后5然后到5的右子树即7

1是根,因此如果不遍历左子树,它就不会转到1

凌俊语
2023-03-14

要按顺序遍历二叉树,需要执行以下操作

(i) Traverse the left most subtree starting at the left external node, 
(ii) Visit the root, and 
(iii) Traverse the right subtree starting at the left external node.

现在要删除节点,

(i) Traverse the left most subtree starting at the left external node,
(ii) delete the root, and 
(iii) Traverse the right subtree starting at the left external node.
易衡
2023-03-14

我最初把它作为一条评论发布,但似乎问这个问题的人对我的回答很满意,所以我会在这里发布更详细的内容。

打电话给free时,一定要注意free到底做了什么,否则类似的事情可能会发生。

C库函数void free(void*ptr)释放之前通过调用calloc、malloc或realloc分配的内存。

请注意,free函数不会更改指针的值,它只是将内存返回给操作系统,以便将其分配给另一个程序。因此,人们通常会在调用free后“清除”指针,以避免访问另一个程序已更改的内存。

root = VOID;

上面的代码在释放根节点后不会清除它,因此内存仍然全部存在。因此,C代码可以转到该内存位置(操作系统已经收到)并对其进行修改。这是非常危险的行为,因为操作系统会将此内存分配给另一个程序,然后您的程序可能会更改,从而导致明显的意外行为。解决这个问题的简单方法是在释放根节点之前移除正确的节点。

 类似资料:
  • 这是一个leetcode问题。 给定一个二叉树,返回其节点值的级序遍历(即从左到右,逐级)。 例如:给定二叉树, 将其级别顺序遍历返回为: 但我正在用JavaScript尝试一种新的方式,而不是完全按照他们的解决方案。到目前为止,我能够打印阵列,但 如何在新行中打印不同的级别 以下是我目前的代码: 输入:[3,9,20,空,空,15,7], LeetCode问题链接:BinarytreeTrave

  • 我想对二叉树执行级别顺序遍历。因此,对于给定的树,说: 产出将是: 我知道我可以使用某种队列,但在C中递归地实现这一点的算法是什么?感谢您的帮助。

  • 我尝试按如下方式执行二叉树的垂直顺序遍历:1)找出每个节点与根节点之间的最小和最大水平距离2)创建一个hashmap,将水平距离映射到相应的节点(Map) 然而,我得到了不想要的输出,我认为在实现中有一些错误,因为算法对我来说似乎是正确的。 以下是完整的代码: 输出:{-1=[99999],0=[99999,12],-2=[99999],1=[99999],2=[99999]}那么我的apProc

  • 我正在研究爪哇的树木,在我正在研究的书中偶然发现了一些令人困惑的台词。给出的顺序遍历图如下: 遍历(递归)的代码是: 我感到困惑的是: 我已经突出了我所困住的部分。首先,我认为在第三步中,inOrder(C)[而不是inOrder(B)]返回inOrder(A)。第二,访问节点的顺序应该是B->A->C。 请帮帮我吧!

  • //执行顺序遍历的递归方法

  • 我正在尝试对二叉树进行垂直顺序遍历,这个问题:https://leetcode.com/problems/vertical-order-traversal-of-a-binary-tree/ 我的方法是:我对树中的每个节点进行深度优先搜索,其中根为0。左边的任何内容都是当前根-1,右边的任何内容都是当前根1。我还有一个HashMap,其中键是节点的值(具有相同位置匹配的值),值是具有相同位置(键值