You are on page 1of 28

#include<stdio.

h>
#include<conio.h>
#include<iostream>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

struct TreeNode{
int data;
TreeNode *left;
TreeNode *right;
};
typedef struct TreeNode *treeNode;

//Khoi tao
void initTree(treeNode &tree){
tree=NULL;
}

//ham kiem tra , NULL=>1
int empty_Tree(treeNode tree){
if(tree==NULL){
return 1;
}
else
return 0;
}

//tao note
TreeNode* getNode(int x){
TreeNode *p=new TreeNode;
if(p==NULL){
return NULL;
}
else{
p->data =x;
p->left=NULL;
p->right=NULL;
}
}

//tao them Node
void InsertNode(treeNode &tree,int x){
if(tree==NULL){
TreeNode *p=getNode(x);
tree=p;
}
else if(tree->data>x){
InsertNode(tree->left,x);
}
else if(tree->data<x){
InsertNode(tree->right,x);
}

}

//ham duyet truoc NLR PreOrder
void NLR(treeNode tree){
if(tree!=NULL){
cout<<tree->data<<" ";
NLR(tree->left);
NLR(tree->right);
}
}

//ham duyet giua LNR Inorder
void LNR(treeNode tree){
if(tree!=NULL){
LNR(tree->left);
cout<<tree->data<<" ";
LNR(tree->right);
}
}

//ham duyet giua LRN Postorder
void LRN(treeNode tree){
if(tree!=NULL){
LRN(tree->left);
LRN(tree->right);
cout<<tree->data<<" ";
}
}

//ham duyet giua RLN
void RNL(treeNode tree){
if(tree!=NULL){
RNL(tree->right);
cout<<tree->data<<" ";
RNL(tree->left);
}
}

//ham xoa 1 node gia tri x
int GetPredecessor(treeNode tree,int data){
while(tree->right!=NULL){
tree=tree->right;
}
data=tree->data;
return data;
}


void Delete(treeNode &tree,int x){
if(tree->data>x){
Delete(tree->left,x);
}
if(tree->data<x){
Delete(tree->right,x);
}
else{
int data;
treeNode temPtr=tree;
if(tree->left==NULL){
tree=tree->right;
delete temPtr;
}
else if(tree->right==NULL){
tree=tree->left;
delete temPtr;
}
else if(tree->left==NULL && tree->right==NULL){
delete temPtr;
}
else{
int data=GetPredecessor(tree->left,data);
tree->data=data;
Delete(tree->left,data);
}
}
}

//Dem nut
int countNode(treeNode tree){
if(tree==NULL){
return 0;
}
else
return 1 + countNode(tree->left)+ countNode(tree->right);
}

//Dem la
int countLeaves(treeNode tree){
if(tree==NULL){
return 0;
}
else if(tree->left==NULL && tree->right==NULL){
return 1;
}
else{
return countLeaves(tree->left)+countLeaves(tree->right);
}
}

//Chieu cao cay
int Depth(treeNode tree){
if(tree==NULL){
return 0;
}
else{
int leftDepth=Depth(tree->left);
int rightDepth=Depth(tree->right);
return (1+(leftDepth>rightDepth?leftDepth:rightDepth));

}
}

//tim x
void timX(treeNode tree,int x){
if(tree==NULL){
return;
}
else{
if(tree->data>x){
timX(tree->left,x);
cout<<" "<<tree->data;
}
else if(tree->data<x){
timX(tree->right,x);
cout<<" "<<tree->data;
}
else
{
cout<<" "<<tree->data;
}

}
}

//Dem cac gia tri lon hon x
int lonhonX(treeNode tree,int x){
if(tree==NULL){
return 0;
}
else{
if(tree->data>x){
return 1 +(lonhonX(tree->left,x) +lonhonX(tree->right,x));
}
else{
return (lonhonX(tree->left,x) +lonhonX(tree->right,x));
}
}
}

//Kiem tra tat ca Node cay co lon hon X
bool checkX(treeNode tree,int x){
if(tree==NULL){
return true;
}
else if(tree->data<=x){
return false;
}
else if(checkX(tree->left,x)==false){
return false;
}
return checkX(tree->right,x);
}

//tim Max cach 1
treeNode timMax(treeNode tree){
if(tree==NULL){
return NULL;
}
treeNode a=timMax(tree->left);
treeNode b=timMax(tree->right);
treeNode max=tree;
if(a!=NULL && a->data>max->data){
max=a;
}
if(b!=NULL && b->data>max->data){
max=b;
}
return max;

}

//tim Max cach 2
treeNode timMax2(treeNode tree){
if(tree==NULL){
return NULL;
}
else if(tree->right ==NULL){
return tree;
}
else if(tree->right!=NULL){
while(tree->right!=NULL){
tree=tree->right;
}
return tree;
}

}

//tim min
treeNode timMin(treeNode tree){
if(tree==NULL){
return NULL;
}
treeNode a=timMin(tree->left);
treeNode b=timMin(tree->right);
treeNode min=tree;
if(a!=NULL && tree->data<min->data){
min=a;
}
if(b!=NULL && tree->data<min->data){
min=b;
}
return min;
}

//tim min cach khac
treeNode timMin1(treeNode tree){
if(tree==NULL){
return NULL;
}
else if(tree->left==NULL){
return tree;
}
else if(tree->left!=NULL){
while(tree->left!=NULL){
tree=tree->left;
}
return tree;
}
}

//kiem tra so nguyen to
int ktnt(int n){
if(n<2){
return 0;
}
for(int i=2;i<=n/2;i++)
if(n%i==0)
return 0;
return 1;
}

//dem co bao nhiu node la so nguyen to
int countSNT(treeNode tree){
if(tree==NULL){
return 0;
}
else{

if(ktnt(tree->data)){
return (1 + countSNT(tree->left)+countSNT(tree->right));
}
else
return countSNT(tree->left)+countSNT(tree->right);
}
}

//in ra so nguyen to
void printSNT(treeNode tree){
if(tree==NULL){
return ;
}
else{

if(ktnt(tree->data)){
cout<<" "<<tree->data;
printSNT(tree->left);
printSNT(tree->right);

}
else{
printSNT(tree->left);
printSNT(tree->right);
}
}
}

//dem so node bac 1
int countBac1(treeNode tree){
if(tree==NULL){
return 0;
}
else{
if((tree->left!=NULL && tree->right==NULL)||(tree->left==NULL && tree-
>right!=NULL)){
return 1+countBac1(tree->left)+countBac1(tree->right);
}
else
return countBac1(tree->left)+countBac1(tree->right);
}
}

//in ra cac node bac 1
void printBac1(treeNode tree){
if(tree==NULL){
return;
}
else{
if((tree->left!=NULL && tree->right==NULL)||(tree->left==NULL && tree-
>right!=NULL)){
cout<<" "<<tree->data;
printBac1(tree->left);
printBac1(tree->right);
}
else{
printBac1(tree->left);
printBac1(tree->right);
}
}
}


//dem so node bac 2
int countBac2(treeNode tree){
if(tree==NULL){
return 0;
}
else{
if(tree->left!=NULL && tree->right!=NULL){
return 1+ countBac2(tree->left)+countBac2(tree->right);
}
else
return countBac2(tree->left)+countBac2(tree->right);
}
}

//cac node bac 2
void printBac2(treeNode tree){
if(tree==NULL){
return ;
}
else{
if(tree->left!=NULL && tree->right!=NULL){
cout<<" "<<tree->data;
printBac2(tree->left);
printBac2(tree->right);
}
else {
printBac2(tree->left);
printBac2(tree->right);

}
}
}
// dem so node co cng muc
int CountNodeSameLevel (treeNode tree, int level) {
if (tree == NULL || level < 0)
return 0;
if (level == 0)
return 1;
return CountNodeSameLevel(tree->left,level-1) + CountNodeSameLevel(tree->right,level-1);
}
//in ra phan tu o muc level
void printNodeSameLevel (treeNode tree, int level) {
if (tree == NULL || level < 0)
return;
if (level == 0) {
cout<<" "<<tree->data;
}
printNodeSameLevel(tree->left,level-1);
printNodeSameLevel(tree->right,level-1);

}

//DH 2008 De 2 cau 2.a : Xuat ra nhung node co gia tri lon hon trung binh cong cua 2 node con
void printNodeLargerAVG(treeNode tree){
int a;
int b;
if(tree==NULL){
return;
}
else{

if(tree->left==NULL){
a=0;
}
else{
a=tree->left->data;
}
if(tree->right==NULL){
b=0;
}
else{
b=tree->right->data;
}
if(tree->data>((a+b)/2)){
cout<<" "<<tree->data;
cout<<"("<<(a+b)/2<<")";// Xuat ra so trung bnh cong

printNodeLargerAVG(tree->left);
printNodeLargerAVG(tree->right);
}
else{
printNodeLargerAVG(tree->left);
printNodeLargerAVG(tree->right);
}
}
}

//DH 2008 De 2 cau 2.b : Dem so node thoa dieu kien lon hon note con ben trai => Dem so Node
int CountNodeLargeNodeLeft(treeNode tree){
if(tree==NULL){
return 0;
}
return 1+CountNodeLargeNodeLeft(tree->left)+CountNodeLargeNodeLeft(tree-
>right);
}

//DH 2008 DE 1 CAU 2.a tim muc chua phan tu lon nhat tren cay => chieu cao cua cay -1
int bacChuaMax(treeNode tree){
return Depth(tree) -1;
}


//DH 2008 DE 1 CAU 2.b dem so node tu k1 den k2
int countNodeK1K2(treeNode tree,int k1,int k2){
if(tree==NULL){
return 0;
}
else
{
if(k1<=0 && k2>=0){
return 1+ countNodeK1K2(tree->left,k1-1,k2-1)+countNodeK1K2(tree-
>right,k1-1,k2-1);
}
else{
return countNodeK1K2(tree->left,k1-1,k2-1)+countNodeK1K2(tree-
>right,k1-1,k2-1);
}
}
}

//DH 2010 CAU 1
//dem so lan xuat hien x tren cay
int countXTree(treeNode tree,int x){
if(tree==NULL){
return 0;
}
else
{
if(tree->data==x){
return 1 +countXTree(tree->left,x) +countXTree(tree->right,x);
}
else{
return countXTree(tree->left,x) +countXTree(tree->right,x);
}
}
}

// tim muc thap nhat cua pt x tren cay
int getLevel(treeNode tree,int x,int level){
if(tree==NULL){
return 0;
}
if(tree->data==x){
return level;
}
else{
getLevel(tree->left,x,level+1);
getLevel(tree->right,x, level+1);
}
}
// tao 1 cay T1 doi xung cay T2
void copyTree(treeNode &copiedTreeRoot,treeNode otherTreeRoot){
if (otherTreeRoot == NULL){
return;
}
else
{
InsertNode(copiedTreeRoot,otherTreeRoot->data);
copyTree(copiedTreeRoot->left, otherTreeRoot->left);
copyTree(copiedTreeRoot->right, otherTreeRoot->right);
}
}


//DH 2010 CAU 2
//Chen pt X vao cay =>hm InsertNode o tren
//In ra nhung phan tu nho hon x
void printSmallerX(treeNode tree,int x){
if(tree==NULL){
return;
}
else{
if(tree->data<x){
cout<<" "<<tree->data;
printSmallerX(tree->left,x);
printSmallerX(tree->right,x);
}
else{
printSmallerX(tree->left,x);
printSmallerX(tree->right,x);
}
}
}

//DH 2011
//BAI 2
// Cap nhat lai node cha = node trai - node phai,la giu nguyen
void updateNode(treeNode tree){

if(tree==NULL){
return;
}else{
if(tree->left!=NULL && tree->right !=NULL){
tree->data=tree->left->data-tree->right->data;
updateNode(tree->left);
updateNode(tree->right);
}
else{
updateNode(tree->left);
updateNode(tree->right);
}

}

}
//in ra gia tri tich cac node tren tung muc cua cay

//tong cac gia tri chan tren cay
int tongChan(treeNode tree){
if(tree==NULL){
return 0;
}
else
{
if(tree->data%2==0){
return tree->data+tongChan(tree->left)+tongChan(tree->right);
}
else
return tongChan(tree->left)+tongChan(tree->right);
}
}



int main() {
treeNode tree;
int x;
initTree(tree);
InsertNode(tree,1);
InsertNode(tree,7);
InsertNode(tree,2);
InsertNode(tree,6);
InsertNode(tree,8);
InsertNode(tree,3);
InsertNode(tree,6);
InsertNode(tree,4);
InsertNode(tree,9);
InsertNode(tree,5);

cout<<endl<<"Sau khi duyet NLR :";
NLR(tree);

cout<<endl<<"Sau khi duyet LNR :";
LNR(tree);

cout<<endl<<"Sau khi duyet LRN :";
LRN(tree);

cout<<endl<<"Sau khi duyet RNL :";
RNL(tree);

//cout<<endl<<"Xoa Node :";
//cin>>x;
//Delete(tree,x);
//cout<<endl<<"Sau khi xoa va duyet RNL :";
//RNL(tree);
cout<<endl<<"So Node :"<<countNode(tree);
cout<<endl<<"So La :"<<countLeaves(tree);
cout<<endl<<"Chieu cao :"<<Depth(tree)<<endl;
cout<<"Tim 1 so va xuat nguoc den goc :";
timX(tree,6);
cout<<endl<<"Lon hon 5 :"<<lonhonX(tree,5);
//cout<<endl<<checkX(tree,0);
cout<<endl<<"So lon nhat : "<<timMax(tree)->data;
cout<<endl<<"So lon nhat : "<<timMax2(tree)->data;
cout<<endl<<"So nho nhat : "<<timMin(tree)->data;
cout<<endl<<"So nho nhat : "<<timMin1(tree)->data;
cout<<endl<<"Dem SNT : "<<countSNT(tree);
cout<<endl<<"Cac so nguyen to: ";
printSNT(tree);
cout<<endl<<"So luong bac 1: "<<countBac1(tree);
cout<<endl<<"Node bac 1 :";
printBac1(tree);
cout<<endl<<"So luong bac 2: "<<countBac2(tree);
cout<<endl<<"Node bac 2 :";
printBac2(tree);
cout<<endl<<"Dem so node o muc k :"<<CountNodeSameLevel(tree,3);
cout<<endl<<"Node o muc k gom:";
printNodeSameLevel(tree,3);


cout<<endl<<endl<<"DH 2008";
//DH 2008 DE 2 CAU 2.a
cout<<endl<<"Nhung Node lon hon trung binh cong cua 2 node con:"<<endl;
printNodeLargerAVG(tree);

//DH 2008 DE 2 CAU 2.b
cout<<endl<<"Dem so node thoa dieu kien lon hon node con ben trai : ";
cout<<CountNodeLargeNodeLeft(tree);

//DH 2008 DE 1 CAU 2.a
cout<<endl<<"Muc chua phan tu lon nhat :"<<bacChuaMax(tree);

//DH 2008 DE 1 CAU 2.b
cout<<endl<<"So Node tu muc k1 den k2 :"<<countNodeK1K2(tree,0,7)<<endl;//k1=0;k2=7

cout<<endl<<"DH 2010";

//cau 1 tim so lan x xuat hien tren cay
cout<<endl<<"So lan x xuat hien : "<<countXTree(tree,9);//x=9

//cau 1 tim muc thap nhat cua pt tu x
cout<<endl<<"Tim muc thap nhat pt x : ";
cout<<getLevel(tree,8,0);

//cau1 tao t1 doi xung t
cout<<endl<<"Cay t1 :";
treeNode t1;
initTree(t1);
copyTree(t1,tree);
NLR(t1);
//Cau 2 in ra node gia tri nho hon x
cout<<endl<<"Node co gia tri nho hon x ";
printSmallerX(tree,9);//x=9

cout<<endl<<"DH 2011"<<endl;
//update Node
updateNode(tree);
NLR(tree);
cout<<endl<<"Tong cac so chan :";
cout<<tongChan(tree);
}

You might also like