#include <stdio.h> #include <iostream> #include <string> using namespace std; #define MaxLength 10 #define NIL -1 typedef string DataType; typedef int Node; typedef struct Tree{ DataType Data[MaxLength]; Node Parent[MaxLength]; int MaxNode; }; void MakeNullTree(Tree &T){ T.MaxNode = 0; } int EmptyTree(Tree T){ return T.MaxNode == 0; } DataType LabelNode(Node i,Tree T){ return T.Data[i]; } Node Parent(Node i,Tree T){ return T.Parent[i]; } void PrintTree(Tree T){ for(int i=0;i<T.MaxNode;i++){ cout<<"Node "<<i<<": "; cout<<"P("<<i<<",T) = "<<Parent(i,T)<<" - "; cout<<"L("<<i<<",T) = "<<LabelNode(i,T)<<endl; } } Node LeftMostChild(Node i, Tree T){ for(Node j=i+1;j<T.MaxNode;j++){ if (Parent(j,T)==i) return j; } return NIL; } Node RightSibling(Node i, Tree T){ Node p = Parent(i,T); for (Node j=i+1;j<T.MaxNode;j++){ if (p==Parent(j,T)) return j; } return NIL; } void PrintChilds(Node i, Tree T){ Node lmc = LeftMostChild(i,T); if (lmc == NIL) cout<<"Node "<<i<<" khong co con!!"; else { cout<<"Danh sach con cua nut "<<i<<endl; cout<<lmc<<" "; Node rs = RightSibling(lmc,T); while(rs!=NIL){ cout<<rs<<" "; rs = RightSibling(rs,T); } } } void PreOrder(Node n,Tree T){ cout<<LabelNode(n,T)<<" "; Node i = LeftMostChild(n,T); while(i!=NIL){ PreOrder(i,T); i=RightSibling(i,T); } } void InOrder(Node n,Tree T){ Node i = LeftMostChild(n,T); if (i!=NIL) InOrder(i,T); cout<<LabelNode(n,T)<<" "; i = RightSibling(i,T); while(i!=NIL){ InOrder(i,T); i = RightSibling(i,T); } } void PostOrder(Node n,Tree T){ Node i = LeftMostChild(n,T); while(i!=NIL){ PostOrder(i,T); i = RightSibling(i,T); } cout<<LabelNode(n,T)<<" "; } bool IsPath(Node A, Node B, Tree T){ Node pB = Parent(B,T); if (pB == A || A == B) return true; else if (pB == NIL) return false; else return IsPath(A,pB,T); } int Path(Node A, Node B, Tree T){ if (!IsPath(A,B,T) || A == B) return 0; else return 1 + Path(A,Parent(B,T),T); } bool IsLeaf(Node n, Tree T){ return LeftMostChild(n,T)==NIL; } bool IsAncestor(Node A, Node B, Tree T){ return IsPath(A,B,T); } bool IsDescendant(Node A,Node B, Tree T){ return IsAncestor(B,A,T); } int Height(Node n, Tree T){ int max = 0; for(Node i=n+1;i<T.MaxNode;i++){ if (IsLeaf(i,T) && IsDescendant(i,n,T)) { int p = Path(n,i,T); if (p>max) max = p; } } return max; } int Depth(Node n, Tree T){ return Path(0,n,T); } Node CommonAncestor(Node A, Node B, Tree T){ if (A == Parent(B,T)) return A; else if (B == Parent(A,T)) return B; else if (Parent(A,T)==Parent(B,T)) return Parent(A,T); int da = Depth(A,T); int db = Depth(B,T); if (da>db) return CommonAncestor(Parent(A,T),B,T); else if (da<db) return CommonAncestor(A,Parent(B,T),T); else return CommonAncestor(Parent(A,T),Parent(B,T),T); } int main(){ Tree T; MakeNullTree(T); string data[10]={"can tho","ninh kieu","ca mau","lam dong","kien giang","hau giang","an giang","soc trang","bac lieu","tra vinh"}; for(int i=0;i<10;i++) T.Data[i]=data[i]; T.Parent={-1,0,0,1,1,4,4,4,2,2}; T.MaxNode=10; PrintTree(T); if (EmptyTree(T)) cout<<"Cay rong!"; cout<<"LeftMostChild(8,T) = "<<LeftMostChild(8,T)<<endl; cout<<"RightSibling(5,T) = "<<RightSibling(5,T)<<endl; PrintChilds(3,T); printf("\nDuyet tien tu:\n"); PreOrder(0,T); printf("\nDuyet trung tu:\n"); InOrder(0,T); printf("\nDuyet hau tu:\n"); PostOrder(0,T); cout<<"\nisPath(2,5,T) = "<<IsPath(2,5,T); cout<<"\nisPath(1,1,T) = "<<IsPath(1,1,T); cout<<"\nisAncestor(1,7,T) = "<<IsAncestor(1,7,T); cout<<"\nisAncestor(2,4,T) = "<<IsAncestor(2,4,T); cout<<"\nisAncestor(4,2,T) = "<<IsAncestor(4,2,T); cout<<"\nisAncestor(0,0,T) = "<<IsAncestor(0,0,T); cout<<"\nisDescendant(7,1,T) = "<<IsDescendant(7,1,T); cout<<"\nisDescendant(4,2,T) = "<<IsDescendant(4,2,T); cout<<"\nisDescendant(5,5,T) = "<<IsDescendant(5,5,T); cout<<"\nPath(1,7,T) = "<<Path(1,7,T); cout<<"\nHeight(0,T) = "<<Height(0,T); cout<<"\nDepth(0,T) = "<<Depth(0,T); cout<<"\nDepth(4,T) = "<<Depth(4,T); cout<<"\nCommonAncestor(2,8,T) = "<<CommonAncestor(2,8,T); cout<<"\nCommonAncestor(8,2,T) = "<<CommonAncestor(8,2,T); cout<<"\nCommonAncestor(9,2,T) = "<<CommonAncestor(9,2,T); cout<<"\nCommonAncestor(5,8,T) = "<<CommonAncestor(5,8,T); cout<<"\nCommonAncestor(8,5,T) = "<<CommonAncestor(8,5,T); cout<<"\nCommonAncestor(3,7,T) = "<<CommonAncestor(3,7,T); return 0; }
