Helly everyone,
本学期我在大学学习了几乎没有先验知识的C ++编码课程(我对指针的理解仍然有些不确定)。 我必须用C ++实现二进制搜索树,我的问题如下: 在具有值和指向左侧和右侧节点的预定义Node结构上,我应该实现几个函数,其中两个是:
void InsertNode(Node* root, Node* node)
应该将手节点放入给定的树“root”中, 另一个叫做
void InsertValue(Node* root, int value)
应该使用传递的值创建节点struct的新实例,并将其放在给定的树“root”中。为此,我应该使用CreateNode(简单函数创建一个新的Node实例的Node *指针,其中int值和左/右指针设置为NULL)和InsertNode。
我有点在跑步机上跑步,我不认为我真的明白这些功能应该如何工作(例如它们之间的区别)。 昨天我写了这个函数:
void InsertNode(Node* root, Node* node){
if(root == NULL){
root = CreateNode(node->value);
}
else if(root->value < node->value){
if(node->left != NULL){
InsertNode(root, node->left);
}
else{
node->left = CreateNode(root->value);
}
}
else if(root->value > node->value){
if(node->right != NULL){
InsertNode(root, node->right);
}
else{
node->right = CreateNode(root->value);
}
}
}
由于我没有真正能够测试这些函数而没有实际用给定节点构建树的后续函数我很好奇我是否可以在这里获得一些帮助下一个函数InsertValue(它应该做什么,InsertNode不会已经?:S)
提前问候和感谢。
答案 0 :(得分:2)
初步说明:此答案假设最初调用InsertNode
函数时root
是树的根,node
是要插入树中的节点。
这个陈述有一个问题:
root = CreateNode(node->value);
由于参数root
是按值传递的,这意味着它被复制,因此赋值只会更改本地副本。一旦函数返回传递给函数的原始指针,就不会改变。
您需要通过引用传递指针,这意味着root
参数引用传入函数的原始变量,而不是复制它。您在声明参数时使用&符号来执行此操作:
Node*& root
以上意味着root
是对指向Node
的指针的引用。
所以完整的InsertNode
声明应该是
void InsertNode(Node*& root, Node* node)
还有其他问题,例如这些行不正确:
if(node->left != NULL){
InsertNode(root, node->left);
}
else{
node->left = CreateNode(root->value);
}
这是不正确的,因为node->left
应始终为NULL
,这使您可以使用树的root
中的值创建新节点,并将其分配给{{1但是你永远不会在树中插入node->left
。
你应该做的只是
node
当然,您应该对设置正确的分支进行相同的更改。
结合上述两种解决方案,您的功能看起来像
InsertNode(node->left, node);
此功能还解决了当前代码的第三个问题:如果void InsertNode(Node*& root, Node* node)
{
if (root == 0)
root = node;
else if (root->value < node->value)
InsertNode(root->left, node);
else
InsertNode(root->right, node);
}
等于到node->value
怎么办?上面的函数将它放在正确的分支中。
答案 1 :(得分:1)
创建树时,还会为每个节点分配值。请参阅以下代码:
typedef struct BST {
int data;
struct BST *lchild, *rchild;
} node;
void insert(node *root, node *new_node) {
if (new_node->data < root->data) {
if (root->lchild == NULL)
root->lchild = new_node;
else
insert(root->lchild, new_node);
}
if (new_node->data > root->data) {
if (root->rchild == NULL)
root->rchild = new_node;
else
insert(root->rchild, new_node);
}
}
node *new_node, *root;
int main()
{
new_node = get_node();
printf("\nEnter The Element ");
scanf("%d", &new_node->data);
if (root == NULL) /* Tree is not Created */
root = new_node;
else
insert(root, new_node)
}
答案 2 :(得分:0)
以下代码在Python中,用于插入BST ::
class Node :
def __init__(self.key):
self.left = None
self.right = None
self.val = key
def insert(root.node):
if root is None :
root = node
else :
if root.val < node.val:
if root.right is None :
root.right = node
else :
insert(root.right, node)
else :
if root.left is None :
root.left = node
else :
insert(root.left, node)
def inorder(root):
if root :
inorder(root.left)
print(root.val)
inorder(root.right)
# Driver program to test the above functions
# Let us create the following BST
# 50
# / \
# 30 70
# / \ / \
# 20 40 60 80
r = Node(50)
insert(r,Node(30))
insert(r,Node(20))
insert(r,Node(40))
insert(r,Node(70))
insert(r,Node(60))
insert(r,Node(80))
# Print inoder traversal of the BST
inorder(r)