| #define _CRT_SECURE_NO_WARNINGS 1 |
| #include "Binary_Tree_.h" |
| #include "./Link_Queues/Link_Queues_.h" |
| |
| void Init_Tree(struct Tree_Node_Pointer* TN_Pointer,const char EndSign) |
| { |
| TN_Pointer->EndSign = EndSign; |
| TN_Pointer->root = NULL; |
| } |
| |
| void TreeShow_Menu() |
| { |
| printf("\n***************************************************************\n"); |
| printf("* [1] Create_Tree ******* [2] Show_Tree_PreMode ***\n"); |
| printf("* [3] Show_Tree_PostMode ******* [4] Show_Tree_CenterMode***\n"); |
| printf("* [5] Show_Tree_LayerMode ******* [6] Tree_Size ***\n"); |
| printf("* [7] Tree_Height ******* [8] TreeSub_Search ***\n"); |
| printf("* [9] TreeSub_Parent ******* [10] TreeSub_LeftChild ***\n"); |
| printf("* [11] TreeSub_RightChild ******* [12] IsEmpty_Tree ***\n"); |
| printf("* [13] Tree_Copy ******* [14] Tree_Clean ***\n"); |
| printf("* [15] Tree_Destroy ************************************\n"); |
| printf("* [0] EixtSystem ************************************\n"); |
| printf("***************************************************************\n"); |
| } |
| |
| static void Create_Tree_(struct Tree_Node_Pointer* TN_Pointer, struct Tree_Node** TN) |
| { |
| EleType element; |
| scanf(EleSign, &element); |
| |
| if (TN_Pointer->EndSign == element) |
| *TN = NULL; |
| else |
| { |
| *TN = (struct Tree_Node*)malloc(sizeof(struct Tree_Node)); |
| assert(NULL != *TN); |
| |
| (*TN)->data = element; |
| Create_Tree_(TN_Pointer, &((*TN)->Left_Tree_Node)); |
| Create_Tree_(TN_Pointer, &((*TN)->Right_Tree_Node)); |
| } |
| } |
| |
| static struct Tree_Node* _Create_Tree_(struct Tree_Node_Pointer* TN_Pointer) |
| { |
| EleType element; |
| scanf(EleSign, &element); |
| |
| if (TN_Pointer->EndSign == element) |
| return NULL; |
| else |
| { |
| struct Tree_Node* TN = (struct Tree_Node*)malloc(sizeof(struct Tree_Node)); |
| assert(NULL != TN); |
| |
| TN->data = element; |
| TN->Left_Tree_Node = _Create_Tree_(TN_Pointer); |
| TN->Right_Tree_Node = _Create_Tree_(TN_Pointer); |
| |
| return TN; |
| } |
| } |
| |
| void Create_Tree(struct Tree_Node_Pointer* TN_Pointer) |
| { |
| |
| TN_Pointer->root = _Create_Tree_(TN_Pointer); |
| } |
| |
| static void Show_Tree_PreMode_(const struct Tree_Node** TN) |
| { |
| if (NULL != (*TN)) |
| { |
| printf(EleSign, (*TN)->data); |
| Show_Tree_PreMode_(&((*TN)->Left_Tree_Node)); |
| Show_Tree_PreMode_(&((*TN)->Right_Tree_Node)); |
| } |
| } |
| |
| void Show_Tree_PreMode(const struct Tree_Node_Pointer* TN_Pointer) |
| { |
| Show_Tree_PreMode_(&(TN_Pointer->root)); |
| } |
| |
| static void Show_Tree_PostMode_(const struct Tree_Node** TN) |
| { |
| if (NULL != (*TN)) |
| { |
| Show_Tree_PostMode_(&((*TN)->Right_Tree_Node)); |
| Show_Tree_PostMode_(&((*TN)->Left_Tree_Node)); |
| printf(EleSign, (*TN)->data); |
| } |
| } |
| |
| void Show_Tree_PostMode(const struct Tree_Node_Pointer* TN_Pointer) |
| { |
| Show_Tree_PostMode_(&(TN_Pointer->root)); |
| } |
| |
| static void Show_Tree_CenterMode_(const struct Tree_Node** TN) |
| { |
| if (NULL != (*TN)) |
| { |
| Show_Tree_CenterMode_(&((*TN)->Left_Tree_Node)); |
| printf(EleSign, (*TN)->data); |
| Show_Tree_CenterMode_(&((*TN)->Right_Tree_Node)); |
| } |
| } |
| |
| void Show_Tree_CenterMode(const struct Tree_Node_Pointer* TN_Pointer) |
| { |
| Show_Tree_CenterMode_(&(TN_Pointer->root)); |
| } |
| |
| static void Show_Tree_LayerMode_(const struct Tree_Node_Pointer* TN_Pointer) |
| { |
| assert(NULL != TN_Pointer); |
| struct Link_Queues_Pointer LQ_P; |
| struct Tree_Node* Head = NULL; |
| |
| Init_Queues(&LQ_P); |
| Join_Queues(&LQ_P, TN_Pointer->root); |
| |
| while(!IsEmpty_Queues(&LQ_P)) |
| { |
| GetHead_Queues(&LQ_P,&Head); |
| Out_Queues(&LQ_P); |
| printf(EleSign, Head->data); |
| |
| if (NULL != Head->Left_Tree_Node) |
| Join_Queues(&LQ_P, Head->Left_Tree_Node); |
| |
| if (NULL != Head->Right_Tree_Node) |
| Join_Queues(&LQ_P, Head->Right_Tree_Node); |
| } |
| } |
| |
| void Show_Tree_LayerMode(const struct Tree_Node_Pointer* TN_Pointer) |
| { |
| Show_Tree_LayerMode_(TN_Pointer); |
| } |
| |
| int Get_Tree_Size_(const struct Tree_Node* TN) |
| { |
| if (NULL == TN) |
| return 0; |
| else |
| return Get_Tree_Size_(TN->Left_Tree_Node) + Get_Tree_Size_(TN->Right_Tree_Node) + 1; |
| } |
| |
| int Tree_Size(const struct Tree_Node_Pointer* TN_Pointer) |
| { |
| return Get_Tree_Size_(TN_Pointer->root); |
| } |
| |
| int Get_Tree_Height_(const struct Tree_Node* TN) |
| { |
| if (NULL == TN) |
| return 0; |
| else |
| { |
| int L_Tree = Get_Tree_Height_(TN->Left_Tree_Node); |
| int R_Tree = Get_Tree_Height_(TN->Right_Tree_Node); |
| return (L_Tree > R_Tree ? L_Tree : R_Tree) + 1; |
| } |
| } |
| |
| int Tree_Height(const struct Tree_Node_Pointer* TN_Pointer) |
| { |
| return Get_Tree_Height_(TN_Pointer->root); |
| } |
| |
| static struct Tree_Node* TreeSub_Search_(const struct Tree_Node* TN,const EleType value) |
| { |
| if (NULL == TN) |
| return NULL; |
| else if (value == TN->data) |
| return TN; |
| else |
| { |
| struct Tree_Node* TN_L = NULL; |
| if (NULL != TN->Left_Tree_Node) |
| TN_L = TreeSub_Search_(TN->Left_Tree_Node, value); |
| |
| if (NULL != TN_L) |
| return TN_L; |
| return TreeSub_Search_(TN->Right_Tree_Node, value); |
| } |
| |
| } |
| |
| struct Tree_Node* TreeSub_Search(const struct Tree_Node_Pointer* TN_Pointer,const EleType value) |
| { |
| return TreeSub_Search_(TN_Pointer->root,value); |
| } |
| |
| static struct Tree_Node* TreeSub_Parent_(const struct Tree_Node* TN, const struct Tree_Node* TN_Sub) |
| { |
| if (NULL == TN) |
| return NULL; |
| if (TN == TN_Sub) |
| return NULL; |
| else |
| { |
| if ((NULL != TN->Left_Tree_Node && TN_Sub == TN->Left_Tree_Node) || |
| (NULL != TN->Right_Tree_Node && TN_Sub == TN->Right_Tree_Node)) |
| return TN; |
| else |
| { |
| struct Tree_Node* TN_L = NULL; |
| |
| TN_L = TreeSub_Parent_(TN->Left_Tree_Node, TN_Sub); |
| if (NULL != TN_L) |
| return TN_L; |
| |
| return TreeSub_Parent_(TN->Right_Tree_Node, TN_Sub); |
| } |
| } |
| } |
| |
| struct Tree_Node* TreeSub_Parent(const struct Tree_Node_Pointer* TN_Pointer, const struct Tree_Node* TN_Sub) |
| { |
| return TreeSub_Parent_(TN_Pointer->root, TN_Sub); |
| } |
| |
| struct Tree_Node* TreeSub_LeftChild_(const struct Tree_Node* TN, const struct Tree_Node* TN_Sub) |
| { |
| if (NULL == TN) |
| return NULL; |
| if (TN == TN_Sub) |
| { |
| if (NULL != TN->Left_Tree_Node) |
| return TN->Left_Tree_Node; |
| |
| return NULL; |
| } |
| else |
| { |
| struct Tree_Node* TN_L = NULL; |
| TN_L = TreeSub_LeftChild_(TN->Left_Tree_Node, TN_Sub); |
| if (NULL != TN_L) |
| return TN_L; |
| |
| return TreeSub_LeftChild_(TN->Right_Tree_Node, TN_Sub); |
| } |
| } |
| struct Tree_Node* TreeSub_LeftChild(const struct Tree_Node_Pointer* TN_Pointer, const struct Tree_Node* TN_Sub) |
| { |
| return TreeSub_LeftChild_(TN_Pointer->root, TN_Sub); |
| } |
| |
| |
| struct Tree_Node* TreeSub_RightChild_(const struct Tree_Node* TN,const struct Tree_Node* TN_Sub) |
| { |
| if (NULL == TN) |
| return NULL; |
| if (TN == TN_Sub) |
| { |
| if (NULL != TN->Right_Tree_Node) |
| return TN->Right_Tree_Node; |
| |
| return NULL; |
| } |
| else |
| { |
| struct Tree_Node* TN_L = NULL; |
| TN_L = TreeSub_RightChild_(TN->Left_Tree_Node, TN_Sub); |
| if (NULL != TN_L) |
| return TN_L; |
| |
| return TreeSub_LeftChild_(TN->Right_Tree_Node, TN_Sub); |
| } |
| } |
| struct Tree_Node* TreeSub_RightChild(const struct Tree_Node_Pointer* TN_Pointer,const struct Tree_Node* TN_Sub) |
| { |
| return TreeSub_RightChild_(TN_Pointer->root, TN_Sub); |
| } |
| |
| char IsEmpty_Tree(const struct Tree_Node_Pointer* TN_Pointer) |
| { |
| return (NULL == TN_Pointer->root ? 1 : 0); |
| } |
| |
| static void Tree_Copy_(const struct Tree_Node* TN, struct Tree_Node** Copied_TN) |
| { |
| if (NULL == TN) |
| *Copied_TN = NULL; |
| else |
| { |
| *Copied_TN = (struct Tree_Node*)malloc(sizeof(struct Tree_Node)); |
| assert(NULL != Copied_TN); |
| |
| (*Copied_TN)->data = TN->data; |
| Tree_Copy_(TN->Left_Tree_Node, &((*Copied_TN)->Left_Tree_Node)); |
| Tree_Copy_(TN->Right_Tree_Node, &((*Copied_TN)->Right_Tree_Node)); |
| } |
| } |
| |
| void Tree_Copy(const struct Tree_Node_Pointer* TN_Pointer, struct Tree_Node_Pointer* Copied_TN_Pointer) |
| { |
| Tree_Copy_(TN_Pointer->root, &Copied_TN_Pointer->root); |
| } |
| |
| static void Tree_Clean_(struct Tree_Node* TN) |
| { |
| if (NULL == TN) |
| return; |
| else |
| { |
| Tree_Clean_(TN->Left_Tree_Node); |
| Tree_Clean_(TN->Right_Tree_Node); |
| free(TN); |
| TN = NULL; |
| } |
| } |
| |
| void Tree_Clean(struct Tree_Node_Pointer* TN_Pointer) |
| { |
| Tree_Clean_(TN_Pointer->root); |
| TN_Pointer->root = NULL; |
| } |
| |
| void Tree_Destroy(struct Tree_Node_Pointer* TN_Pointer) |
| { |
| Tree_Clean(TN_Pointer); |
| } |