struct node{
int data;
struct node*left,*right;
};
node* root; //global root
node* getNode(int item)
{
node* new_node = new node;
new_node->data = item;
new_node->left=new_node->right=NULL;
return new_node;
}
node* insert(node* localroot, int item)
{
if(localroot == NULL){
localroot = getNode(item);
}
else if(item < localroot->data)
localroot->left = insert(localroot->left, item);
else if(item > localroot->data)
localroot->right = insert(localroot->right, item);
root = localroot;
return root; //Why do I have to return root if it is global?
//without this output is wrong
}
void inorder(node* root)
{
if(root != NULL){
inorder(root->left);
std::cout << root->data << ' ';
inorder(root->right);
}
}
void postorder(node* root)
{
if(root != NULL){
postorder(root->left);
postorder(root->right);
std::cout << root->data << ' ';
}
}
int main()
{
insert(root, 15);
insert(root, 9);
insert(root, 2);
insert(root, 1);
insert(root, 4);
insert(root, 18);
std::cout<<"inorder traversal of tree is: ";
inorder(root);
std::cout << "\nPostOrder: ";
postorder(root);
return 0;
}
通常我们主要称之为insert,比如root=insert(root,10)
(其中根在main()中声明)
我想声明root globaly,但insert函数不能为void,它必须返回node*值。我可以得到一个解释吗<如果有更好的方法,请分享(实际上我想把insert变成void类型)<问候,
您的函数插入
的返回类型意味着您必须通过以下方式调用它
root = insert(root, 15);
在你的职责范围内,这些陈述
root = localroot;
return root; //Why do I have to return root if it is global?
//without this output is wrong
你错了。
使用您的函数声明,可以通过以下方式定义函数
node* insert( node* localroot, int item )
{
if ( localroot == NULL ){
localroot = getNode( item );
}
else if ( item < localroot->data )
localroot->left = insert( localroot->left, item );
else if ( item > localroot->data )
localroot->right = insert( localroot->right, item );
return localroot;
}
您编写插入
的方式要求它始终返回它修改或创建的节点。这可确保在没有子节点的节点上的插入
设置正确的成员(左或右)。
您可以通过传入对要设置的指针的引用,将root
重写为纯命令:
void insert(int item, node*& localroot = root) {
if (localroot == nullptr) {
localroot = getNode(item);
return;
}
if (item == localroot->data) {
return;
} else if(item < localroot->data) {
insert(item, localroot->left);
} else if(item > localroot->data) {
insert(item, localroot->right);
}
}
要实现的关键点是,localroot
的赋值将反映在数据结构中,因此:
插入(项目)
时,localroot
是对root
的引用,它是一个空指针。因此,第一个子句适用,您用一个新节点覆盖localRoot
。因为localRoot
是对root
的引用,所以也会更新。localRoot
绑定到N-
如果默认参数对您来说太神奇,请将其分为两个函数:
void insert_helper(int item, node*& localroot) {
// as above
}
void insert(int item) {
insert_helper(item, root);
}
我创建了一个二叉查找树类。我创建了我的插入方法、高度方法和打印方法。当我插入时,一切看起来都很好。如果根为空,我创建一个新的根并设置该项目。但是当我调用我的高度方法时,它打印出2而不是1。当我调用print方法时,它会两次打印出包括root在内的所有元素。例如,我按以下顺序插入了以下元素:9, 5, 4, 55, 555 当我调用PREorderPRINT方法时,它会输出:9, 5, 4, 9,
编辑:我想出来了——放弃了这个设计,重新开始,它成功了!谢谢你的建议。 我正在做一个BST算法的家庭作业,我绝望地被困在插入方法上。我在网上找到的所有资源都有一个与我创建的版本相似的版本,但是我没有通过教授给我们的JUnit测试。我可以通过基本情况(root.payload==value的空根和二叉树)。不过,我似乎无法通过下一个测试。这是我的插入(root, value)方法代码: 最终返回的是
我正在尝试使用(不平衡的)BST实现树集。我还希望为树中的所有节点维护一个有序的双链接列表。 链表是在2个前哨节点的帮助下维护的,一个头节点和一个尾节点。因此,要遍历链表,您需要从头节点开始,检查它的属性。 我有一个递归的方法,就像这样; 其中和设置在链表中将插入新节点的位置的边界。 我在维护节点的和属性时遇到了问题。
我正在为BST开发一个递归插入方法。假定该函数是一个递归辅助方法,并且位于名为Node的私有类中。节点类位于名为BinarySearchTree的类中,该类包含根的实例变量。当我尝试插入一个元素时,我在以下位置得到一个NullPointerException: 这左=插入((节点)左)。元素); 我不确定为什么会发生这种情况。如果我理解正确,在BST中,我假设将项目插入到所横穿路径的最后一点。感谢
我正在尝试实现BST,但是我的树的head值每次都返回无。我尝试在Python中查找其他实现,但它们通常只是声明一个根并将其传递到类本身之外,而不是将head自包含在类中。
我知道,不允许重复。例如,如果我有一个词“RABSAB”。 上述字符串的二进制搜索树是: 如果我们想在树中包含重复项呢。这棵树将如何改变?我在一次采访中被问到这个问题。 他们让我画: 二叉树 不平衡二叉搜索树 没有重复项的二叉搜索树 具有重复项的二叉搜索树 感谢您的帮助! PS:帮我画相关的树