Tree insert(Tree BST, int x){ if(!BST){ BST=(Tree)malloc(sizeof(struct TNode)); BST->Data=x; BST->Left=BST->Right=NULL; } if(x<BST->Data) BST->Right=insert(BST->Right,x); else if(x>BST->Data) BST->Left=insert(BST->Left,x); return BST; }
时间: 2024-04-28 17:26:21 浏览: 75
这是一段二叉搜索树(Binary Search Tree,BST)的插入操作代码。它的作用是将一个值为 x 的节点插入到 BST 中,并返回插入后的 BST 的根节点指针。
首先,如果 BST 为空,就创建一个新节点,并将 x 赋值给它的 Data 域,同时将其左右子树指针设为空。然后,根据 x 和当前节点的大小关系,选择递归插入左子树或右子树,直到找到一个空位置。最后,返回插入后的 BST 的根节点指针。
需要注意的是,这段代码中的 BST 参数是指向根节点的指针,因为在递归过程中,BST 的值可能会被改变,直到最终插入新节点后,根节点可能已经发生了变化。因此,必须返回插入后的根节点指针。
相关问题
typedef int ElementType; typedef struct TreeNode *BinTree; typedef BinTree Position; //链式存储结构体定义 struct TreeNode{ ElementType Data; BinTree Left; BinTree Right; }; /* 01 插入 函数名:Insert 入参:BinTree BST,ElementType X 出参:BinTree BST */ BinTree Insert( BinTree BST, ElementType X ){ if(!BST){//二叉搜索树如果为空,则初始化 BST=(BinTree)malloc(sizeof(struct TreeNode)); BST=->Date=X; BST->Left=NULL; BST->Right=NULL; }else{ if(X<BST->Data)//若小,则挂在左边 BST->Left=Insert(BST->Left,X); else if(X>BST->Data)//若大,则挂在右边 BST->Right=Insert(BST->Right,X); //若不相等,则不操作; } return BST; } /* //02 递归查找 /* //06 通序遍历 函数名:InorderTraversal 入参:(BinTreeBST) 出参:void*/ void InorderTraversal( BinTree BST ); { if(BST){ Inordertraversal(BST->Left); printf("%d",BST->Data) ; InorderTraversal(BST->Right); } printf("\n"); } int main(){ BinTree BST=NULL; BST=Insert(BST,5); BST=Insert(BST,7); BST=Insert(BST,3); BST=Insert(BST,1); BST=Insert(BST,2); BST=Insert(BST,4); BST=Insert(BST,6); BST=Insert(BST,8); BST=Insert(BST,9); InorderTraversal(BST); printf("\n"); }帮我改正这段代码
好的,我看到您提供的代码有一些错误,我帮您修改如下:
```
typedef int ElementType;
typedef struct TreeNode *BinTree;
typedef BinTree Position;
struct TreeNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
/* 01 插入 函数名:Insert 入参:BinTree BST,ElementType X 出参:BinTree BST */
BinTree Insert( BinTree BST, ElementType X ){
if(!BST){//二叉搜索树如果为空,则初始化
BST=(BinTree)malloc(sizeof(struct TreeNode));
BST->Data=X;
BST->Left=NULL;
BST->Right=NULL;
}else{
if(X<BST->Data)//若小,则挂在左边
BST->Left=Insert(BST->Left,X);
else if(X>BST->Data)//若大,则挂在右边
BST->Right=Insert(BST->Right,X);
//若不相等,则不操作;
}
return BST;
}
/* 06 中序遍历 函数名:InorderTraversal 入参:(BinTreeBST) 出参:void*/
void InorderTraversal( BinTree BST ){
if(BST){
InorderTraversal(BST->Left);
printf("%d ",BST->Data) ;
InorderTraversal(BST->Right);
}
}
int main(){
BinTree BST=NULL;
BST=Insert(BST,5);
BST=Insert(BST,7);
BST=Insert(BST,3);
BST=Insert(BST,1);
BST=Insert(BST,2);
BST=Insert(BST,4);
BST=Insert(BST,6);
BST=Insert(BST,8);
BST=Insert(BST,9);
InorderTraversal(BST);
printf("\n");
return 0;
}
```
主要修改了以下几个地方:
1. 在 `struct TreeNode` 的定义中,`BinTree` 的定义已经完成,不需要再次定义。
2. 在 `Insert` 函数中,对二叉搜索树初始化的操作有误,应该是 `BST->Data=X` 而不是 `BST=->Date=X`。
3. 在 `InorderTraversal` 函数中,函数名字写错了(多了一个 `traversal`),并且应该在输出每个节点时加上一个空格,以便阅读。
希望这次修改能够帮到您,如有其他问题,欢迎继续提问。
#include<stdio.h> #include<stdlib.h> typedef int KeyType; typedef struct node{ KeyType key; struct node*lchild,*rchild; }BSTNode,*BSTree; void InsertBST(BSTree*bst,KeyType key){ BSTree s;//?????????????????怎么不一样 if(*bst==NULL){ s=(BSTree)malloc(sizeof(BSTNode)); s->key=key; s->lchild=NULL; s->rchild=NULL; *bst=s; return; } else if(key<(*bst)->key) InsertBST(&((*bst)->lchild),key); else if(key>(*bst)->key) InsertBST(&((*bst)->rchild),key); } void CreateBST(BSTree*bst){ KeyType key; *bst=NULL; scanf("%d",&key); while(key!=0){ InsertBST(bst,key); scanf("%d",&key); } } BSTree DelBST(BSTree t,KeyType k){ BSTNode *p,*f,*s,*q; p=t;f=NULL; while(p){ if(p->key==k)break; f=p; if(p->key>k)p=p->lchild; else p=p->rchild; } if(p==NULL)return t; if(p->lchild==NULL){ if(f==NULL)t=p->rchild; else if(f->lchild==p)f->lchild=p->rchild; else f->rchild=p->rchild; free(p); } else{ q=p;s=p->lchild; while(s->rchild) {q=s;s=s->rchild; }if(q==p)q->lchild=s->lchild; else q->rchild=s->lchild; p->key=s->key; free(s); } return t; } int layer(BSTree bst,int k,int lay){ if(bst){ if(bst->key==k)return lay; if(bst->key>k){ lay++; return layer(bst->rchild,k,lay); } if(bst->key<k){ lay++; return layer(bst->lchild,k,lay); } } } void preOrder(BSTree bst){ if(bst!=NULL){ printf("%d ",bst->key); preOrder(bst->lchild); preOrder(bst->rchild); } if(bst==NULL)printf("# "); } void InOrder(BSTree bst){ if(bst!=NULL){ InOrder(bst->lchild); printf("%d ",bst->key); InOrder(bst->rchild); } } int main(){ BSTree bst; CreateBST(&bst); preOrder(bst); int key; scanf("%d",&key); bst=DelBST(bst,key); InOrder(bst); int n,lay=1; scanf("%d",&n); printf("%d",layer(bst,n,lay)); return 0; }为什么层数始终是0?怎么改
在函数`layer`中,当`bst->key>k`时,应该调用`layer(bst->lchild,k,lay)`,而不是`layer(bst->rchild,k,lay)`,因为左子树的值比根节点的值小,而右子树的值比根节点的值大。
因此,修改后的`layer`函数应该是这样的:
```c++
int layer(BSTree bst, int k, int lay) {
if (bst) {
if (bst->key == k) return lay;
if (bst->key > k) {
lay++;
return layer(bst->lchild, k, lay); // 这里应该是左子树
}
if (bst->key < k) {
lay++;
return layer(bst->rchild, k, lay); // 这里应该是右子树
}
}
return -1;
}
```
修改后的代码应该就可以正确地输出层数了。
阅读全文