30
#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;

Tree

Embed Size (px)

DESCRIPTION

trt

Citation preview

Page 1: Tree

#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

Page 2: Tree

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);

}

Page 3: Tree

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

Page 4: Tree

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;

}

Page 5: Tree

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);

Page 6: Tree

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);

Page 7: Tree

}

}

//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;

Page 8: Tree

}

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));

}

Page 9: Tree

}

}

//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;

Page 10: 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;

}

Page 11: 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){

Page 12: Tree

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;

Page 13: Tree

}

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{

Page 14: Tree

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;

}

Page 15: Tree

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);

Page 16: Tree

}

}

//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 cùng muc

int CountNodeSameLevel (treeNode tree, int level) {

if (tree == NULL || level < 0)

return 0;

Page 17: Tree

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{

Page 18: Tree

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 bình cong

printNodeLargerAVG(tree->left);

printNodeLargerAVG(tree->right);

}

else{

printNodeLargerAVG(tree->left);

printNodeLargerAVG(tree->right);

}

}

}

Page 19: Tree

//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);

Page 20: Tree

}

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

Page 21: Tree

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);

}

}

Page 22: Tree

//DH 2010 CAU 2

//Chen pt X vao cay =>hàm 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){

Page 23: 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

Page 24: Tree

{

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);

Page 25: Tree

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);

Page 26: Tree

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 : ";

Page 27: Tree

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 ";

Page 28: Tree

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);

}