nếu trong main() thay đổi như sau
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ỉ?Code:main(){ root=new node; root->key=10; root->left=root->right=NULL; input(); scan(root); return 0; }
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.
nếu trong main() thay đổi như sau
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ỉ?Code:main(){ root=new node; root->key=10; root->left=root->right=NULL; 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.
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: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.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; }
Thân!
Nơi nào khiến anh dừng bước, nơi đó có em.
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.
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