以递归方式将元素插入BinaryTree

时间:2016-03-29 20:57:55

标签: c++ pointers recursion binary-tree

我试图递归地编写以下方法以将节点插入到二叉树中。策略是基本上将节点插入任何NULL左或右指针。

typedef struct BinaryTreeNode {
int data;
BinaryTreeNode * left;
BinaryTreeNode * right;
} BinaryTreeNode;

void InsertElementInBinaryTree(BinaryTreeNode *root, BinaryTreeNode *element) {
    if(root) {
         if(root -> left == NULL) root -> left = element;
         else if(root -> right == NULL) root -> right = element;
         InsertElementInBinaryTree(root -> left, element);
         InsertElementInBinaryTree(root -> right, element);
    }
}

在主函数

中调用该方法如下

InsertElementInBinaryTree(&root , new BinaryTreeNode{8, NULL,NULL});

问题是此调用总是返回分段错误错误,所以我认为错误在递归中?

3 个答案:

答案 0 :(得分:0)

你错过了一些条件:

     if (root->data > element->data) {
         if (root->left == NULL) {
             root->left = element;
         } else {
             InsertElementInBinaryTree(root->left, element);
         }
     } else {
         if (root->right == NULL) {
             root->right = element;
         } else {
         InsertElementInBinaryTree(root->right, element);
          }
     }

答案 1 :(得分:0)

如果您正在尝试实现二叉树,那么对于任何当前节点,左子树中的所有节点应该比当前节点中的datadata以及来自所有data的节点正确的子树应该更大。

void InsertElementInBinaryTree(BinaryTreeNode *&root, BinaryTreeNode *element) {
     if(root == NULL) { root = element; return;}
     if(root -> data > element -> data) 
         InsertElementInBinaryTree(root->left, element);
     else
         InsertElementInBinaryTree(root->right, element);
}

因此实际上data值会定义将插入的位置element。我还要传递BinaryTreeNode *&root作为参考,以使root指针可以修改。

用法:

// declare root
BinaryTreeNode* root;
// insertion, no & operator before root
InsertElementInBinaryTree(root, new BinaryTreeNode{8, NULL,NULL});

答案 2 :(得分:0)

该功能可以按以下方式查看

void InsertElementInBinaryTree( BinaryTreeNode * &root, int data ) 
{
    if ( root == nullptr )
    {
        root = new BinaryTreeNode { data, nullptr, nullptr };
    }
    else if ( data < root->data )
    {
        InsertElementInBinaryTree( root->left, data );
    }
    else
    {
        InsertElementInBinaryTree( root->right, data );
    }
}

并调用

InsertElementInBinaryTree( root , 8 );

并且对象root应该最初定义为

BinaryTreeNode *root = nullptr;