二叉树中的有序遍历

时间:2016-05-29 16:59:40

标签: c binary-search-tree inorder

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

我认为没有任何理由在此处放置任何主要功能,因为我只会将其用于打印该数组的元素。

我的函数,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 ;
    }

1 个答案:

答案 0 :(得分:0)

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

另一件事:你的if / elseif / elseif / else是无用的:你可以随时应用相同的治疗方法。伪代码,假设任何节点left->val < node->val < right->val

  1. 获取树的大小(如果你还没有)
  2. malloc()一个大小为* sizeof(int)的数组(这是唯一的分配 你需要),将索引初始化为0
  3. 然后你可以做一个简单的递归:

    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);
    }
    

    就是这样!