【问题标题】:In-order traverse in a binary tree二叉树中的有序遍历
【发布时间】:2016-05-29 16:59:40
【问题描述】:

我尝试编写一个函数来按顺序遍历二叉树并将其项按顺序放入整数数组中。我知道这段代码包含一些不好的做法,但我想知道的是为什么我的函数不会创建目标整数数组。例如,即使我的函数可以找到保留 bst 的所有项目所需的大小,它也无法正确放置这些项目。有时它只放置 2 个节点,有时只放置根。

我认为没有任何理由将任何 main 函数放在这里,因为我只会将它用于打印该数组的元素。

我的函数、全局变量和 TreeNode 的 typedef 块;

typedef struct TreeNode{
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
} TreeNode;

    int ctr = 0;
    int size = 0;

    int* inorder(TreeNode *root, int* arr){

        if(ctr==0) /*if first call to this function*/
            arr = malloc(size*sizeof(int)) ;

        ctr++ ; 

        if(root){

            if(!root->left && !root->right){        
                arr = realloc(arr, ++size*sizeof(int)) ;
                arr[size-1] = root->val ;
            }

            else if(!root->left&&root->right){
                arr = realloc(arr, ++size*sizeof(int)) ;
                arr[size-1] = root->val ;
                arr=inorder(root->right,arr) ;  
            }
            else if(!root->right&&root->left){
                arr=inorder(root->left,arr) ;
                arr = realloc(arr, ++size*sizeof(int)) ;
                arr[size-1] = root->val ;
            }
            else{
                arr=inorder(root->left,arr) ;
                arr = realloc(arr, ++size*sizeof(int)) ;
                arr[size-1] = root->val ;
                arr=inorder(root->right,arr) ;

            }

            return arr ;
        }
        else
            return arr ;
    }

【问题讨论】:

    标签: c binary-search-tree inorder


    【解决方案1】:

    哎呀,你在每次函数调用时都在做一个 realloc() 。 realloc() 成本很高,应该尽可能少地使用。您应该将树的大小保持在某个地方。如果不能,可以第一次遍历,统计元素个数。

    另一件事:你的 if/elseif/elseif/else 没用:你总是可以应用相同的处理。伪代码,假设对于任何节点left->val < node->val < right->val

    1. 获取树的大小(如果你还没有的话)
    2. malloc() 一个大小为 size*sizeof(int) 的数组(这是唯一的分配 你需要),将索引初始化为 0

    然后你可以做一个简单的递归:

    void inorder(Treenode *root, int *array, int *index) {
        if (!root)
            return;
    
        inorder(root->left, array, index);
        array[*index] = root->val;
        (*index)++;
        inorder(root->right, array, index);
    }
    

    就是这样!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-08
      • 2020-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-09
      • 2012-01-01
      相关资源
      最近更新 更多