我试图递归地编写以下方法以将节点插入到二叉树中。策略是基本上将节点插入任何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});
问题是此调用总是返回分段错误错误,所以我认为错误在递归中?
答案 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)
如果您正在尝试实现二叉树,那么对于任何当前节点,左子树中的所有节点应该比当前节点中的data
低data
以及来自所有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;