在C语言实现二叉搜索树时,是否需重新赋值根节点?
你的二叉搜索树无输出问题分析与修复方案
你猜的完全没错!程序无输出的核心原因就是根节点指针始终没被正确赋值——你的insert函数采用了值传递的方式接收节点指针,函数内部对指针的修改根本不会影响到main里的root变量。
问题拆解
- 指针传递的坑:当你第一次调用
insert(root, 45)时,root是NULL,函数里执行A = (Node*)malloc(sizeof(Node))只是修改了函数内部的局部变量A,main中的root依然是NULL。后续所有插入操作都在操作空指针,最终inorder遍历的还是空树,自然没有输出。 - 二叉搜索树逻辑错误:在插入值小于当前节点值的分支里,你错误地写了
insert(A->right, value),应该是A->left,这会导致所有较小的值都被插到右子树,完全违背了二叉搜索树的规则。
修复方案
这里提供两种常用的修复方式:
方式1:让insert函数返回新的节点指针
修改insert的返回类型为Node*,每次插入后返回更新后的节点指针,这样main里可以直接用返回值更新root:
#include <stdio.h> #include <stdlib.h> typedef struct node { int data; struct node *left, *right; }Node; void addToNode(Node *A, int value) { A->data=value; A->left=NULL; A->right=NULL; } Node* insert(Node *A, int value) { if(A==NULL) { A = (Node*)malloc(sizeof(Node)); addToNode(A, value); return A; } else { if(value>A->data) { A->right = insert(A->right, value); } else if(value<A->data) { // 修复left/right的错误 A->left = insert(A->left, value); } return A; } } void inorder(Node *root) { if (root != NULL) { inorder(root->left); printf("%d \n", root->data); inorder(root->right); } } int main() { Node *root = NULL; int A[]={45,32,56,23,11,89}; for(int i=0; i<6; i++) // 用返回值更新root指针 root = insert(root,A[i]); inorder(root); }
方式2:使用二级指针传递
通过传递指针的指针,让函数可以直接修改外部的指针变量:
#include <stdio.h> #include <stdlib.h> typedef struct node { int data; struct node *left, *right; }Node; void addToNode(Node *A, int value) { A->data=value; A->left=NULL; A->right=NULL; } void insert(Node **A, int value) { if(*A==NULL) { *A = (Node*)malloc(sizeof(Node)); addToNode(*A, value); return; } else { if(value>(*A)->data) { insert(&(*A)->right, value); } else if(value<(*A)->data) { // 修复left/right的错误 insert(&(*A)->left, value); } } } void inorder(Node *root) { if (root != NULL) { inorder(root->left); printf("%d \n", root->data); inorder(root->right); } } int main() { Node *root = NULL; int A[]={45,32,56,23,11,89}; for(int i=0; i<6; i++) // 传递root的地址 insert(&root,A[i]); inorder(root); }
测试结果
修复后运行程序,会输出二叉搜索树的中序遍历结果(升序):
11 23 32 45 56 89
内容的提问来源于stack exchange,提问作者Aditya Vinod Kumar
相关产品推荐
相关产品推荐

