Hàm bạn (friend function) trong lập trình hướng đối tượng với C++
1. Hàm bạn (friend function) là gì? Ngôn ngữ C++ có một hàm rất đặc biệt...
Kết quả sẽ mở trong tab mới, giới hạn trong website này.
Truy cập nhanh
Tìm kiếm gần đây
1. Biểu diễn cây nhị phân Cây nhị phân là một cấu trúc dữ liệu bao gồm các nút được kết nối với nhau theo quan hệ cha con với mỗi nút cha có tối đa 2 nút con. Mỗi nút của cây nhị phân sẽ lưu các thông tin sau: Giá trị lưu tại […]
Cây nhị phân là một cấu trúc dữ liệu bao gồm các nút được kết nối với nhau theo quan hệ cha con với mỗi nút cha có tối đa 2 nút con. Mỗi nút của cây nhị phân sẽ lưu các thông tin sau:
Chúng ta có thể sử dụng danh sách liên kết để biểu diễn cây nhị phân. Đầu tiên, cần định nghĩa một nút trong cấu trúc dữ liệu dạng cây.
struct tNode{
int data;
tNode *pLeft, *pRight;
};
Để lưu trữ cây, chúng ta chỉ cần xác định nút gốc của cây.
tNode *root;Có nhiều thao tác trên cây nhị phân như:
void insertNode(tNode *p, int value){
tNode *node = newNode(value);
if (p->pLeft == NULL){
p->pLeft = node;
}else if (p->pRight == NULL) {
p->pRight = node;
}else{
node->pLeft = p->pLeft;
p->pLeft = node;
}
}
void insertNewRoot(int value){
tNode *node = newNode(value);
node->pLeft = root;
root = node;
}
Có 3 kiểu duyệt chính có thể áp dụng trên cây nhị phân:
Xử lý nút đang duyệt trước, sau đó mới duyệt đến các cây con bên trái và bên phải.
void NLR(tNode *root){
if(root!=NULL){
if(root!=NULL){
cout<<root->data<<" ";
}
NLR(root->pLeft);
NLR(root->pRight);
}
}
Xử lý cây con bên trái trước, rồi mới xử lý nút đang duyệt, cuối cùng xử lý cây con bên phải.
void LNR(tNode *root){
if(root!=NULL){
LNR(root->pLeft);
if(root!=NULL){
cout<<root->data<<" ";
}
LNR(root->pRight);
}
}
Xử lý cây con bên trái trước, rồi xử lý cây con bên phải, cuối cùng mới xử lý nút đang duyệt.
void LRN(tNode *root){
if(root!=NULL){
LRN(root->pLeft);
LRN(root->pRight);
if(root!=NULL){
cout<<root->data<<" ";
}
}
}
Cho cây nhị phân như hình bên dưới.
#include <iostream>
using namespace std;
struct tNode{
int data;
tNode *pLeft, *pRight;
};
tNode *root;
//create new node
tNode *newNode(int data){
tNode *node = new tNode;
node->data = data;
node->pLeft = NULL;
node->pRight = NULL;
return node;
}
//insert new Node into tree
void insertNode(tNode *p, int value){
tNode *node = newNode(value);
if (p->pLeft == NULL){
p->pLeft = node;
}else if (p->pRight == NULL) {
p->pRight = node;
}else{
node->pLeft = p->pLeft;
p->pLeft = node;
}
}
//insert new Node into root
void insertNewRoot(int value){
tNode *node = newNode(value);
node->pLeft = root;
root = node;
}
void NLR(tNode *root){
if(root!=NULL){
if(root!=NULL){
cout<<root->data<<" ";
}
NLR(root->pLeft);
NLR(root->pRight);
}
}
void LNR(tNode *root){
if(root!=NULL){
LNR(root->pLeft);
if(root!=NULL){
cout<<root->data<<" ";
}
LNR(root->pRight);
}
}
void LRN(tNode *root){
if(root!=NULL){
LRN(root->pLeft);
LRN(root->pRight);
if(root!=NULL){
cout<<root->data<<" ";
}
}
}
int main()
{
//create Nodes
root = newNode(1);
tNode *node2 = newNode(2);
tNode *node3 = newNode(3);
tNode *node4 = newNode(4);
tNode *node5 = newNode(5);
tNode *node6 = newNode(6);
tNode *node7 = newNode(7);
//assign childnodes
root->pLeft = node2;
root->pRight = node3;
node2->pLeft = node4;
node2->pRight = node5;
node5->pLeft = node6;
node5->pRight = node7;
//traverse binary tree with NLR
cout<<"traverse tree with NLR:";
NLR(root);
//traverse tree LNR
cout<<"\ntraverse tree with LNR:";
LNR(root);
//traverse tree LRN
cout<<"\ntraverse tree with LRN:";
LRN(root);
//insert new Node into tree
insertNode(node2, 9);
//traverse binary tree with NLR after insert new Node
cout<<"\ntraverse tree with NLR:";
NLR(root);
system("pause");
}
traverse tree with NLR:1 2 4 5 6 7 3
traverse tree with LNR:4 2 6 5 7 1 3
traverse tree with LRN:4 6 7 5 2 3 1
traverse tree with NLR:1 2 9 4 5 6 7 3
Cho một cây nhị phân như hình bên dưới:
Viết chương trình C++ với các yêu cầu sau:
a. Tạo cây nhị phân như hình trên.
b. Duyệt cây nhị phân trên theo thứ tự NLR, LNR, LRN.
c. Chèn một nút mới lưu data = 8 làm con bên trái của nút có data = 2. Đồng thời, nút có data = 4 làm con của nút mới lưu data = 8.
d. Tìm nút lưu trữ giá trị data = 5 trong cây nhị phân trên.