You are on page 1of 19

Bài 1:

#include <iostream>
using namespace std;

struct TNODE {
int key;
TNODE* pLeft;
TNODE* pRight;
};
typedef TNODE* TREE;
void InsertNode(TNODE*& root, int value) {
if (value == -1)
return;

if (root == NULL) {
root = new TNODE;
root->key = value;
root->pLeft = NULL;
root->pRight = NULL;
return;
}
if (value == root -> key) {
return;
}
if (value < root->key) {
InsertNode(root->pLeft, value);
} else {
InsertNode(root->pRight, value);
}
}

void CreateTree(TREE& root) {


int value;
while (true) {
cin >> value;
if (value == -1) {
break;
}
InsertNode(root, value);
}
}
int Height(TREE t)
{
if (t == NULL)
return -1;
return max(Height(t->pRight),Height(t->pLeft))+1;
}
int main() {
TREE T; //hay: TNODE* T;
T = NULL; // Khoi tao cay T rong, or: CreateEmptyTree(T)
CreateTree(T);
if(T==NULL) cout << "Empty Tree.";
else cout << Height(T);
return 0;
}

void InsertNode(TNODE*& root, int value) {


if (value == -1)
return;

if (root == NULL) {
root = new TNODE;
root->key = value;
root->pLeft = NULL;
root->pRight = NULL;
return;
}
if (value == root -> key) {
return;
}
if (value < root->key) {
InsertNode(root->pLeft, value);
} else {
InsertNode(root->pRight, value);
}}
void CreateTree(TREE& root) {
int value;
while (true) {
cin >> value;
if (value == -1) {
break;
}
InsertNode(root, value);
}}
TNODE* search(TREE t, int x){
if (t==NULL) return NULL;
if (t != NULL)
{
if (t->key == x) return t;
else if (t->key > x) return search(t->pLeft, x);

else return search(t->pRight,x);


}}
int Height(TREE t){
if (t == NULL)
return -1;
return max(Height(t->pRight),Height(t->pLeft))+1;}
int HeightOfNode(TREE t, int x){
TNODE* p = search(t,x);
if (t == NULL)
return -1;
return Height(p);}

Bài 3:
void InsertNode(TNODE*& root, int value) {
if (value == -1)
return;

if (root == NULL) {
root = new TNODE;
root->key = value;
root->pLeft = NULL;
root->pRight = NULL;
return;
}
if (value == root -> key) {
return;
}
if (value < root->key) {
InsertNode(root->pLeft, value);
} else {
InsertNode(root->pRight, value);
}}
void CreateTree(TREE& root) {
int value;
while (true) {
cin >> value;
if (value == -1) {
break;
}
InsertNode(root, value);
}}

TNODE* FindMax(TREE& T){


if(T != NULL) {
if(T->pRight != NULL) return FindMax(T->pRight);
return T;
}
return NULL;}
Bài 4:

void InsertNode(TNODE*& root, int value) {


if (value == -1)
return;

if (root == NULL) {
root = new TNODE;
root->key = value;
root->pLeft = NULL;
root->pRight = NULL;
return;
}
if (value == root -> key) {
return;
}
if (value < root->key) {
InsertNode(root->pLeft, value);
} else {
InsertNode(root->pRight, value);
}}
void CreateTree(TREE& root) {
int value;
while (true) {
cin >> value;
if (value == -1) {
break;
}
InsertNode(root, value);
}}

TNODE* FindMin(TREE& T){


if(T != NULL) {
if(T->pLeft != NULL) return FindMin(T->pLeft);
return T;
}
return NULL;}
Bài 5:
TNODE* CreateNode(int x){
TNODE* p=new TNODE();
if(p==NULL)exit(1);
p->key =x;
p->pLeft=NULL;
p->pRight=NULL;
return p;}

int Insert(TREE &T, int x) {


if (T)
{
if (T->key == x) return 0;
if (T->key > x) return Insert(T->pLeft, x);
return Insert(T->pRight, x);
}
T = CreateNode(x);
return 1;}
void CreateTree(TREE &T){
int x;
cin >> x;
while(x != -1){
if(x == -1) break;
Insert(T, x);
cin >> x;
}}

TNODE* search(TREE& T, int x, int& lv){


if(T != NULL) {
++lv;
if(T->key == x) return T;
if(T->key > x) return search(T->pLeft, x, lv);
return search(T->pRight, x, lv);
}
return NULL;}
void PrintLevel(TREE& T, int x, int& lv){
TNODE* p = search(T, x, lv);
if(p == NULL) lv = -1;}
Bài 6:
void CreateTree(TREE &T){
int x;
cin >> x;
while(x != -1){
if(x == -1) break;
Insert(T, CreateTNode(x));
cin >> x;
}}

TNODE* search(TREE& T, int x){


if(T != NULL) {
if(T->key == x) return T;
if(T->key > x) return search(T->pLeft, x);
return search(T->pRight, x);
}
return NULL;}

TNODE* FindSiblings1(TREE& T, int x){


if(T == NULL) {
return NULL;
}
if (T->pLeft != NULL && T->pRight != NULL){
if(T->pRight->key == x){
return T->pLeft;
}
else if(T->pLeft->key == x){
return T->pRight;
}
}
if (FindSiblings1(T->pLeft, x) != NULL) return FindSiblings1(T-
>pLeft, x);
if (FindSiblings1(T->pRight, x) != NULL) return
FindSiblings1(T->pRight, x);
return NULL;}
void FindSiblings(TREE& T, int& x){
if(T == NULL) {
cout << "Empty Tree.";
return;
}
if(T->key == x) {
cout << x << " is Root.";
return;
}
TNODE* p = search(T, x);
if(p == NULL) {
cout << "Not found " << x << ".";
return;
}
TNODE* q = FindSiblings1(T, x);
if(q == NULL){
cout << x << " has no siblings.";
}
else (q->key < x) ? cout << q->key << " and " << x << " are
siblings." : cout << x << " and " << q->key << " are siblings." ;}
Bài 7:
void CreateTree(TREE &T){
int x;
cin >> x;
while(x != -1){
if(x == -1) break;
Insert(T, CreateTNode(x));
cin >> x;
}}

TNODE* search(TREE& T, int x){


if(T != NULL) {
if(T->key == x) return T;
if(T->key > x) return search(T->pLeft, x);
return search(T->pRight, x);
}
return NULL;}
TNODE* FindSiblings1(TREE& T, int x){
if(T == NULL) {
return NULL;
}
if((T->pLeft != NULL && T->pLeft->key == x)|| (T->pRight->key
== x && T->pRight != NULL)){
return T;
}
if (T->key > x) return FindSiblings1(T->pLeft, x);
else return FindSiblings1(T->pRight, x);
return NULL;}
void FindSiblings(TREE& T, int& x){
if(T == NULL) {
cout << "Empty Tree.";
return;
}
if(T->key == x){
cout << x << " has no parent.";
return;
}
TNODE* p = search(T, x);
if(p == NULL) {
cout << "Not found " << x << ".";
return;
}
TNODE* q = FindSiblings1(T, x);
if(q == NULL){
cout << "Not found " << x << ".";
}
else cout << q->key << " is parent of " << x << ".";}
Bài 8:
void CreateEmptyTree(TREE &T) {
T = NULL;}
TNODE* CreateTNode(int x) {
TNODE *p=new TNODE; //c?p phát vùng nh? d?ng
p->key = x; //gán tru?ng d? li?u c?a node = x
p->pLeft = NULL;
p->pRight = NULL;
return p;}int Insert(TREE &T, TNODE *p) {
if (T) {
if (T->key == p->key) return 0;
if (T->key > p->key)
return Insert(T->pLeft, p);
return Insert(T->pRight, p);
}
T = p;
return 1;}
void CreateTree(TREE &T){
int x;
cin >> x;
while(x != -1){
if(x == -1) break;
Insert(T, CreateTNode(x));
cin >> x;
}}

TNODE* search(TREE& T, int x){


if(T != NULL) {
if(T->key == x) return T;
if(T->key > x) return search(T->pLeft, x);
return search(T->pRight, x);
}
return NULL;}
void FindAncestors(TREE& T, int x, TNODE* p, int a[], int& n){
if(T == NULL) return;
if(T->key == x) return;
a[n++] = T->key;
if(T->key > p->key) {
FindAncestors(T->pLeft, x, p, a, n);
}
else if(T->key < p->key) {
FindAncestors(T->pRight, x, p, a, n);
}}
void PrintAncestors(TREE& T, int& x){
if(T == NULL) {
cout << "Empty Tree.";
return;
}
if(T->key == x){
cout << "Node is root.";
return;
}
TNODE* p = search(T, x);
if(p != NULL){
int a[100] = {0};
int n = 0;
FindAncestors(T, x, p, a, n);
for(int i = n - 1; i >= 0; i--){
cout << a[i] << " ";
}
}
else
cout << "-1";}
BÀi 9:

void CreateEmptyTree(TREE &T) {


T = NULL;}
TNODE* CreateTNode(int x) {
TNODE *p=new TNODE; //c?p phát vùng nh? d?ng
p->key = x; //gán tru?ng d? li?u c?a node = x
p->pLeft = NULL;
p->pRight = NULL;
return p;}int Insert(TREE &T, TNODE *p) {
if (T) {
if (T->key == p->key) return 0;
if (T->key > p->key)
return Insert(T->pLeft, p);
return Insert(T->pRight, p);
}
T = p;
return 1;}

void CreateTree(TREE &T){


int x;
cin >> x;
while(x != -1){
if(x == -1) break;
Insert(T, CreateTNode(x));
cin >> x;
}}

TNODE* findMinNode(TNODE* root) {


while (root->pLeft != NULL) {
root = root->pLeft;
}
return root;}
void DeleteNode(TREE& T, int value) {
if (T == NULL) {
return;
}
if (value < T->key) {
DeleteNode(T->pLeft, value);
}
else if (value > T->key) {
DeleteNode(T->pRight, value);
}
else {
if (T->pLeft == NULL && T->pRight == NULL) {
delete T;
T = NULL;
}
else if (T->pLeft == NULL) {
TNODE* temp = T;
T = T->pRight;
delete temp;
}
else if (T->pRight == NULL) {
TNODE* temp = T;
T = T->pLeft;
delete temp;
}
else {
TNODE* temp = findMinNode(T->pRight);
T->key = temp->key;
DeleteNode(T->pRight, temp->key);
}
}}
void preOrderTraversal(TREE T) {
if (T != NULL) {
cout << T->key << " ";
preOrderTraversal(T->pLeft);
preOrderTraversal(T->pRight);
}}

void PrintTree(TREE T) {
if (T == NULL) {
cout << "Empty Tree.";
}
else {
preOrderTraversal(T);
}}
Bài 10:
void InsertNode(TNODE*& root, int value) {
if (value == -1)
return;

if (root == NULL) {
root = new TNODE;
root->key = value;
root->pLeft = NULL;
root->pRight = NULL;
return;
}
if (value == root -> key) {
return;
}
if (value < root->key) {
InsertNode(root->pLeft, value);
} else {
InsertNode(root->pRight, value);
}}
void CreateTree(TREE& root) {
int value;
while (true) {
cin >> value;
if (value == -1) {
break;
}
InsertNode(root, value);
}}

TNODE* search(TREE& T, int x, int &lv){


if(T != NULL) {
++lv;
if(T->key == x) return T;
if(T->key > x) return search(T->pLeft, x, lv);
return search(T->pRight, x, lv);
}
return NULL;}
int Height(TREE& T){
if(T == NULL) return 0;
return Height(T->pRight) + Height(T->pLeft) + 1;}
void TongSoNodeTrai_LonHon_TongSoNodePhai_1dv(TREE& T){
if(T == NULL) return;
TongSoNodeTrai_LonHon_TongSoNodePhai_1dv(T->pLeft);
TongSoNodeTrai_LonHon_TongSoNodePhai_1dv(T->pRight);
if(Height(T->pLeft) - Height(T->pRight) == 1){
cout << T->key << " ";
}
}

You might also like