Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: [c/c++]lỗi tạo cây

  1. #1
    Ngày gia nhập
    07 2007
    Nơi ở
    Sơn La
    Bài viết
    133

    Mặc định [c/c++]lỗi tạo cây

    Mới học về cây cân bằng. Đanh định đi làm bài thì vướng cái tạo cây.
    Mọi người chỉ giùm với nhé.Tìm mà chưa ra vấn đề, hix hix
    Code:
    #include "iostream.h"
    #include "conio.h"
    
    struct node {
     int key;
     node *left,*right; 
    };
    node *root;
    //////////////////
    int insert(node *tree,int key){
               if(tree){
               if(tree->key == key)   return 0; 
               if(tree->key > key)
                 return insert(tree->left,key); 
               else return insert(tree->right,key);
    }
    
    tree= new node;
    if(tree == NULL)  return -1;
    tree->key   = key;
    tree->left =tree->right = NULL;
    return 1;   
    }
    //////////////////
    void visit(node *temp){
         cout<<temp->key<<endl;
    }
    //////////////////
    void scan(node *tree){
    	if(tree!=NULL){     
    	 visit(tree);
    	 scan(tree->left);
    	 scan(tree->right);
    	}
    }
    /////////////////
    void input(){
     int key=1;
      while(key){
      cout<<"Nhap vao mot khoa nguyen"<<endl;
       cin>>key;   
        insert(root,key);    
      }
    }
    main(){
    input();
    scan(root);
    return 0;
    }
    Trao đổi kiến thức sẽ giúp ta tiếp cận nhanh với kiến thức.

  2. #2
    Ngày gia nhập
    07 2007
    Nơi ở
    Sơn La
    Bài viết
    133

    nếu trong main() thay đổi như sau
    Code:
    main(){
      root=new node;
      root->key=10;
      root->left=root->right=NULL;
     input();
     scan(root);
     return 0;
    }
    Thì nó sẽ in ra 10 (ok).Nhưng nếu thêm trái(left) hoặc phải (right) thì vẫn đứt liên kết.Vậy là sao nhỉ?
    Trao đổi kiến thức sẽ giúp ta tiếp cận nhanh với kiến thức.

  3. #3
    Ngày gia nhập
    02 2007
    Nơi ở
    TP.HCM - dưới cầu SG
    Bài viết
    12

    Một số lỗi sai nhỏ ở đoạn code đầu của bạn:
    + Chỉ khai báo root nhưng trong main gọi insert => root ko phải là NULL nên ko tạo node mới mà là insert vào bên trái hoặc bên phải của root.
    + Hàm insert làm thay đổi root nên ta phải dùng tham chiếu &
    + Hàm input nếu ngay lần đầu tiên bạn nhập key = 0 thì node 0 vẫn được tạo ( hình như ko đúng ý đồ người lập trình )
    Mình tạm sửa như sau:
    Code:
    #include <iostream.h>
    #include <conio.h>
    
    struct node {
     int key;
     node *left,*right; 
    };
    node *root = NULL; // phải khởi tạo để insert đúng
    //////////////////
    int insert(node *&tree,int key){
        if(tree){
    		if(tree->key == key)   return 0; // insert fails; node exists
    		if(tree->key > key)
    			return insert(tree->left,key); 
    		else return insert(tree->right,key);
    	}
    	else { // sử dụng else và ko cần kiểm tra tree == NULL
    		tree= new node;
    		//if(tree == NULL)  return -1;
    		tree->key   = key;
    		tree->left =tree->right = NULL;
    		return 1; // insert ok   
    	}
    }
    //////////////////
    void visit(node *temp){
         cout<<temp->key<<endl;
    }
    //////////////////
    void scan(node *tree){
    	if(tree!=NULL){     
    	 visit(tree);
    	 scan(tree->left);
    	 scan(tree->right);
    	}
    }
    /////////////////
    void input(){
     int key=1;
      while(key){
      cout<<"Nhap vao mot khoa nguyen"<<endl;
       cin>>key;   
        insert(root,key);    
      }
    }
    main(){
    	input();
    	scan(root);
    	system( "pause" );
    	return 0;
    }
    Phần bạn hỏi bên dưới chắc bạn tự trả lời được. Cách hiện thực trên cũng chưa chuẩn, bạn nên đọc thêm sách về Cấu trúc dữ liệu.
    Thân!
    Nơi nào khiến anh dừng bước, nơi đó có em.

  4. #4
    Ngày gia nhập
    07 2007
    Nơi ở
    Sơn La
    Bài viết
    133

    Cảm ơn nhé.
    Thực ra lúc đầu trong input(..) mình có gán root=NULL;
    Nhưng mọi cái đều không được.
    Mình đã nhầm lẫn biến con trỏ.Cứ nghĩ là khi truyền như vậy là nó cung cấp thẳng đến địa chỉ rồi và thay đổi.
    Như vậy là mình nắm chưa vững về con trỏ ở phần này.
    Cảm ơn nhiều, mình hiểu thêm về nó rồi.
    Trao đổi kiến thức sẽ giúp ta tiếp cận nhanh với kiến thức.

  5. #5
    Ngày gia nhập
    09 2006
    Bài viết
    16

    theo mình học thì cây cân bằng là cây AVL chứ ko phải là cây BST, hình như cái bạn đang làm là cây BST thì phải.
    nothing is impossible

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn