递归二叉树函数

Posted

技术标签:

【中文标题】递归二叉树函数【英文标题】:Recursive binary tree function 【发布时间】:2011-05-31 08:54:56 【问题描述】:

我正在尝试将我的数组中的项目插入到我的树中。我的函数工作正常,并创建节点一直到树左侧的叶节点。问题是当它应该在检测到更高级别的叶节点时递归返回时,它只是完全停止构建树。代码如下:

void WLD::treeInsert(BSP_Node *tree_root, int node_number)



if ( tree_root == NULL ) 
    
        tree_root = new BSP_Node();

        tree_root->node_number = node_number;
        tree_root->normalX = bsp_array[node_number].normal[0];
        tree_root->normalY = bsp_array[node_number].normal[1];
        tree_root->normalZ = bsp_array[node_number].normal[2];
        tree_root->splitdistance = bsp_array[node_number].splitdistance;;
        tree_root->region = bsp_array[node_number].region;
        tree_root->left = bsp_array[node_number].left; //because the array starts at index 0
        tree_root->right = bsp_array[node_number].right; //because the array starts at index 0
        tree_root->left_node = NULL;
        tree_root->right_node = NULL;

        errorLog.OutputSuccess("Inserting new node: %i", node_number);
        errorLog.OutputSuccess("Left node index: %i", bsp_array[node_number].left);
        errorLog.OutputSuccess("Right node index: %i", bsp_array[node_number].right);

        node_number++;

        // Check for leaf nodes
        if(tree_root->region != 0)
        
            errorLog.OutputSuccess("This is a leaf node! Returning!");
            return;
        
    


    if ( tree_root->left > 0) 
    
        //tree_root->left_node = new BSP_Node();
        errorLog.OutputSuccess("Left node not NULL, inserting it!");
        treeInsert( tree_root->left_node, tree_root->left );
    
    else if (tree_root->right > 0)
    
        //tree_root->right_node = new BSP_Node();
        errorLog.OutputSuccess("Right node not NULL, inserting it!");
        treeInsert( tree_root->right_node = NULL, tree_root->right );
    


如您所见,当它检测到叶子节点时,它应该返回调用函数(这个函数但在更接近节点的级别上。有人有什么建议吗?

【问题讨论】:

tree_root->left > 0 应该写成 tree_root->left != NULL (它只是让它更清楚)。 【参考方案1】:
if ( tree_root->left > 0)  
   // implementation

else if (tree_root->right > 0) 
   // implementation

这不应该是两个单独的 if 语句,而不是 if/else 吗?否则它只会做一侧或另一侧,而不是两者。

【讨论】:

谢谢。这正是答案!

以上是关于递归二叉树函数的主要内容,如果未能解决你的问题,请参考以下文章

二叉树的非递归遍历

二叉树图解以及二叉树的递归原理

二叉树和递归框架

建立二叉树,层序、先序遍历

关于二叉树,高分!

两万字硬核解析树与二叉树所有基本操作(包含堆,链式二叉树基本操作及测试代码,和递归函数的书写方法)