我尝试使用迭代在 BST 树中插入,但输出不完整。问题可能在哪里?
i tried insertion in BST tree using itteration but the output is incomplete. Where is might be the problem?
**我在BST中使用itteraton机制进行插入操作。我使用递归进行顺序遍历 swift 显示我的树,并知道我这样做是对还是错。但是,输出始终为 4 。我不明白嗯可能是什么问题。我的根没有更新吗? **
#include<stdio.h>
#include<stdlib.h>
typedef struct Node{
int data;
struct Node *left;
struct Node *right;
}node;
node *new(int data){ //create node
node *pw;
pw = (node *)malloc(sizeof(node *));
pw->data = data;
pw->left = NULL;
pw->right= NULL;
return pw;
}
node *insert(node *root, int data ){ //insert using itteration
node *pr;
pr = root;
if(root==NULL)
return new(data);
while(pr!= NULL){
if(data< pr->data){
if(pr->left==NULL){
pr->data = data;
pr=NULL;
}
else{
pr= pr->left;
}
}else if(data> pr->data){
if(pr->right==NULL){
pr->data = data;
pr=NULL;
}
else{
pr= pr->right;
}
}
}
return pr;
}
void inorder(node *root) {
if (root != NULL) {
// Traverse left
inorder(root->left);
// Traverse root
printf("%d -> ", root->data);
// Traverse right
inorder(root->right);
}
}
void main(){
node* root = NULL;
root = insert(root,5);
root = insert(root,6);
root = insert(root,4);
inorder(root); //inorder traversal for displaying tree
}
您似乎总是在更改父节点的数据,而不是创建一个新节点作为父节点的子节点。
所以而不是:
if(pr->left==NULL){
pr->data = data;
pr=NULL;
}
需要:
if(pr->left==NULL){
pr->left = new(data);
break; /*you have inserted the node, a break will stop the loop*/
}
应该对右侧的 if 语句应用相同的更改。
此外 - insert
有此 return 语句:return pr
并且您将其保存到调用方的 root
中。但是,只有当 root
开始时为 NULL 时,才会更改 root
。换句话说:返回 pr
是错误的。
因此做这个改变:
return pr; ---> return root;
**我在BST中使用itteraton机制进行插入操作。我使用递归进行顺序遍历 swift 显示我的树,并知道我这样做是对还是错。但是,输出始终为 4 。我不明白嗯可能是什么问题。我的根没有更新吗? **
#include<stdio.h>
#include<stdlib.h>
typedef struct Node{
int data;
struct Node *left;
struct Node *right;
}node;
node *new(int data){ //create node
node *pw;
pw = (node *)malloc(sizeof(node *));
pw->data = data;
pw->left = NULL;
pw->right= NULL;
return pw;
}
node *insert(node *root, int data ){ //insert using itteration
node *pr;
pr = root;
if(root==NULL)
return new(data);
while(pr!= NULL){
if(data< pr->data){
if(pr->left==NULL){
pr->data = data;
pr=NULL;
}
else{
pr= pr->left;
}
}else if(data> pr->data){
if(pr->right==NULL){
pr->data = data;
pr=NULL;
}
else{
pr= pr->right;
}
}
}
return pr;
}
void inorder(node *root) {
if (root != NULL) {
// Traverse left
inorder(root->left);
// Traverse root
printf("%d -> ", root->data);
// Traverse right
inorder(root->right);
}
}
void main(){
node* root = NULL;
root = insert(root,5);
root = insert(root,6);
root = insert(root,4);
inorder(root); //inorder traversal for displaying tree
}
您似乎总是在更改父节点的数据,而不是创建一个新节点作为父节点的子节点。 所以而不是:
if(pr->left==NULL){
pr->data = data;
pr=NULL;
}
需要:
if(pr->left==NULL){
pr->left = new(data);
break; /*you have inserted the node, a break will stop the loop*/
}
应该对右侧的 if 语句应用相同的更改。
此外 - insert
有此 return 语句:return pr
并且您将其保存到调用方的 root
中。但是,只有当 root
开始时为 NULL 时,才会更改 root
。换句话说:返回 pr
是错误的。
因此做这个改变:
return pr; ---> return root;