首页 > 代码库 > 二叉搜索树的实现及指针问题的一点思考(C++)

二叉搜索树的实现及指针问题的一点思考(C++)

今天实现二叉搜索树的时候因为指针的问题卡了一上午(实在不应该。。。),一直segmentation fault,个人感觉还是需要记录一下的。

首先贴一下做的题的意思:

输入一系列整数,建立二叉排序数,并进行前序,中序,后序遍历。(jobdu 1201)

题目很简单,就是基本的二叉树的建立,最后代码如下

  1 #include<iostream>
  2 #include<cstdio>
  3 using namespace std;
  4 class node{
  5 public:
  6     int val;
  7     node* left;
  8     node* right;
  9     node(int v=0){
 10         val=v;
 11         left=NULL;
 12         right=NULL;
 13     }
 14 };
 15 node* Search(node* root ,int tar)
 16 {
 17     node* p=root;
 18     node* pre=NULL;
 19     while(p!=NULL){
 20         pre=p;
 21         if(p->val>tar){
 22             p=p->left;
 23         }
 24         else if(p->val<tar){
 25             p=p->right;
 26         }
 27         else{
 28             return NULL;
 29         }
 30     }
 31     return pre;
 32 }
 33 void Insert(node** root,int tar)
 34 {
 35     node* p=*root;
 36     if(*root==NULL){
 37         *root=new node(tar);
 38         return ;
 39     }
 40     node* ans=Search(*root,tar);
 41     if(ans!=NULL){
 42         if(ans->val<tar){
 43             ans->right=new node(tar);
 44         }
 45         else{
 46             ans->left=new node(tar);
 47         }
 48     }
 49 }
 50 void ilr(node* root)
 51 {
 52     node *p=root;
 53     if(p!=NULL){
 54         cout<<root->val<<" ";
 55         ilr(root->left);
 56         ilr(root->right);
 57     }
 58 }
 59 void lir(node* root)
 60 {
 61     node *p=root;
 62     if(p!=NULL){
 63         lir(root->left);
 64         cout<<root->val<<" ";
 65         lir(root->right);
 66     }
 67 }
 68 void lri(node* root)
 69 {
 70     node *p=root;
 71     if(p!=NULL){
 72         lri(root->left);
 73         lri(root->right);
 74         cout<<root->val<<" ";
 75     }
 76 }
 77 void deletetree (node* root){
 78     node * p = root;
 79     if (p != NULL){
 80         deletetree (p->left);
 81         deletetree (p->right);
 82         delete (p);
 83     }
 84 }
 85 int main()
 86 {
 87     //freopen("t","r",stdin);
 88     int n;
 89     while(cin>>n){
 90         node* root=NULL;
 91         for(int i=0;i<n;i++){
 92             int x;
 93             cin>>x;
 94             Insert(&root,x);
 95             //cout<<root->val<<endl;
 96         }
 97         ilr(root);
 98         cout<<endl;
 99         lir(root);
100         cout<<endl;
101         lri(root);
102         cout<<endl;
103         deletetree(root);
104     }
105     return 0;
106 }

代码有几个问题还是很有必要注意的:

一、关于指针的初始化问题,记得看过某本书说过虽然有的编译器会对各种不同的数据类型进行初始化,但是我们还是自己干这个比较保险,这次因为太久没碰指针忘了这条忠告,终于是记起来了。

二、并不是说传入指针就能达到同步的更新,开始一直没注意到这个问题。这次的insert函数中因为传入了一个根节点的指针,以为这样的更改两边就可以同步了,但是最后发现怎么也插不进值了。。。其实所谓的使用指针可以达到同步更新作用实际上是两边对同一个东西操作,但是这里只是传入指针就不行了,所以这里需要指针的指针。

三、所谓的segmentation fault很大情况下是因为内存操作的原因,也就是说指针可能指到了错误的内存中去了。所以遇到这个错误你就要尤其小心你的指针操作,这时候借助一些调试工具可能更方便。