//三.遍历二叉树 // A | A // / \ | / \ // B C | C B // / \ \ | / / \ // D E F | F E D //镜像 // // 先序(根、左、右) A B D E C F // 中序(左、根、右) D B E A C F // 后序(左、右、根) D E B F C A // 层序 (1----h) A B C D E F voidpre_order_print(Bin_tree root); //三.1.前序递归遍历 voidmid_order_print(Bin_tree root); //三.2.中序递归遍历 voidlast_order_print(Bin_tree root); //三.3.后序递归遍历
staticintmax(int a, int b) { return b > a ? b : a; } //创建节点 static Tree_node *create_node(void) { Tree_node *node = (Tree_node *)Malloc(sizeof(Tree_node)); bzero(node, sizeof(Tree_node));
return root; } //一.2.通过前序和中序创建二叉树 //Bin_tree create_tree_by_pre_mid(char *pre_str, char *mid_str, int length); // A // / \ // B G // / \ / \ // C D H J // / \ \ // E F I // 先序: ABCDEFGHIJ 确定当前序列中根地位置 // 中序: CBEDFAHIGJ 得到某个节点地左右子树部分 // // 1.先序确定出 A 为根,则CBEDF为左子树内容,HIGJ为右子树内容 // 先序: (A) BCDEF GHIJ // 中序: CBEDF (A) HIGJ // // A // / \ // CBEDF HIGJ // // 2.先序中确定 B 为A的左子树的根,则C为B左子树内容,EDF为B右子树内容, // 且,通过先序中剩下的元素可知,G为A的右子树的根.且HI为G的左子树,J为G的右子树,即 // 先序: (A) [B]CDEF [G]HIJ // 中序: C [B] EDF (A) HI[G]J // // A // / \ // B G // / \ / \ // C EDF HI J // // 3.先序中确定 C 为B左子树的根,则D为B右子树的根,E为D左子树内容,F为D右子树内容, // 且,通过先序中剩下的元素可知,H是G为左子树的根.且J为G的右子树,I为H的右子树,即 // 先序: (A) [B]C D E F [G]H IJ // 中序: C [B] E D F (A) H I[G]J // A // / \ // B G // / \ / \ // C D H J // / \ \ // E F I Bin_tree create_tree_by_pre_mid(char *pre_str, char *mid_str, int length)//通过先序和中序构建二叉树
//三.遍历二叉树 // A | A // / \ | / \ // B C | C B // / \ \ | / / \ // D E F | F E D // // 先序(根、左、右) A B D E C F // 中序(左、根、右) D B E A C F // 后序(左、右、根) D E B F C A // 层序 (1----h) A B C D E F // A // / \ // B G // / \ / \ // C D H J // / \ \ // E F I // // // 先序: ABCDEFGHIJ 确定当前序列中根地位置 // 中序: CBEDFAHIGJ 得到某个节点地左右子树部分 // 后序: CEFDBIHJGA // ////////////////////////////////////////////////////////////////// // // A // / \ // B C // / \ // D E // // ABDEC pre // DEBCA last //////////////////////////////////////////////////////////////////// // // A // / // B // / \ // D E // // ABDE // // DEBA // // A A // / \ // B B // / / \ // D D E // / // E // // //三.1.前序递归遍历 //void pre_order_print(Bin_tree root); void pre_order_print(Bin_tree root) //前序递归遍历 { if(root != NULL){ printf("%c ", root->data); pre_order_print(root->left_child); pre_order_print(root->right_child); } }
//三.4.前序非递归遍历 //void pre_order_print_nr(Bin_tree root); // // A // / \ // B G // / \ / \ // C D H J // / \ \ // E F I // // 先序: ABCDEFGHIJ 确定当前序列中根地位置 // // 借助栈,在打印当前节点后分别记录其右、左孩子 // A // A B // A B C // A B C D // A B C D E // A B C D E F // A B C D E F G // A B C D E F G H // A A B C D E F G H I // A B B C D E F G H I J // | A | | B | | G | | C | | D | | E | | F | | G | | H | | I | | J | | | // | | | G | | | | D | | G | | F | | G | | | | J | | J | | | | | // | | | | | | | G | | | | G | | | | | | | | | | | | | // | | | | | | | | | | | | | | | | | | | | | | | | // | | | | | | | | | | | | | | | | | | | | | | | | // A B C D E F G H I J void pre_order_print_nr(Bin_tree root) //前序非递归遍历 { Stack *stack = init_stack(); Tree_node *p_node = NULL;
do { while(p_node != NULL) { //首先找到当前节点最左边的节点 push_stack(stack, p_node); p_node = p_node->left_child; } q_node = NULL; tag = 1; while(!is_stack_empty(stack) && tag ) { get_top_stack(stack, (void **)&p_node); if(p_node -> right_child == q_node) { printf("%c ", p_node->data); pop_stack(stack); q_node = p_node; } else { tag =0; p_node = p_node->right_child; } } }while(!is_stack_empty(stack)); destroy_stack(&stack); } //三.7.层序遍历 //void level_order_print(Bin_tree root); // // A // / \ // B G // / \ / \ // C D H J // / \ \ // E F I // // A B G C D H J E F I // // 队列进行层序遍历: // // ^ A B G C D H J E F I // | | A | | | | G | | G | | C | | D | | H | | J | | E | | F | | I | | | // ^ | | | | | | | C | | D | | H | | J | | E | | F | | I | | | | | // | | | | | | | | D | | H | | J | | E | | F | | I | | | | | | | // ^ | | | | | | | | | J | | | | F | | I | | | | | | | | | // | | | | | | | | | | | | | | | | | | | | | | | | | // ^ A B G C D H J E F I // void level_order_print(Bin_tree root) //层序遍历 { Queue *queue = NULL; Tree_node *p_node = NULL;
//四.二叉树的变量 //四.1.得到二叉树的镜像 //void swap_left_right(Bin_tree root); voidswap_left_right(Bin_tree root)//得到二叉树的镜像 { // A | A // / \ | / \ // B C | C B // / \ \ | / / \ // D E F | F E D if(root == NULL || (root->left_child == NULL && root->right_child == NULL)){ return ; }
//四.2.得到二叉树的高度 //int get_binarytree_height(Bin_tree root); intget_binarytree_height(Bin_tree root)//得到二叉树的高度 { // A // / \ // B G // / \ / \ // C D H J // / \ \ // E F I if(root == NULL){ return0; }
//四.3.得到二叉树的最大路径 //int get_largest_dir_count(Bin_tree root); // // // A A A // / \ / / \ // B G B B C // / \ / \ / \ / \ // C D H J C D D E // / \ \ / \ / \ // E F I E F F G // // 最大路径: // EDBAGHI ECBDF FDBAC // 长度为6 长度为4 长度为4 // // 情况A:路径经过左子树的最深节点,通过根节点,再到右子树的最深节点; // 情况B:路径不穿过根节点,而是左子树(或右子树)的最大距离路径,取其大者. // // 这两种情况的最大值就是该二叉树的最大路径. // // intget_largest_dir_count(Bin_tree root) { int distence = 0; if(root == NULL) { return0; } elseif(root->left_child == NULL && root->right_child == NULL) { return0; } distence = max(get_binarytree_height(root->left_child)+get_binarytree_height(root->right_child), max(get_largest_dir_count(root->left_child), get_largest_dir_count(root->right_child))); return distence; }
//得到二叉树的高度h和节点个数n // //判断: // if (2^h - 1) == n, 满二叉树 // else 不是满二叉树 height = get_binarytree_height(root); count = get_binarytree_node_count(root);
return ( ((int)pow(2, height) - 1) == count) ;
}
//五.2.判断是否是完全二叉树 //Boolean is_complete_binary_tree(Bin_tree root); // A // / \ // B G // / \ / // C D H // // 1.层序遍历: // // 2.分两个状态: // 从根节点开始,入队列,如果队列不为空,循环。 // 遇到第一个没有左儿子或者右儿子的节点,设置标志位, // 如果之后再遇到有左/右儿子的节点,那么这不是一颗完全二叉树。 // // A // / \ // B G // / \ / \ // C D H J // / \ / \ // K L E F Boolean is_complete_binary_tree(Bin_tree root)//判断是否是完全二叉树 { int flag = 0; Queue *queue = NULL; Tree_node *p_node = NULL;
Tree_node *find_common_node(Bin_tree root, Tree_node *node1, Tree_node *node2 )//找到两个节点的最近公共节点 { // A // / \ // B G // / \ / \ // C D H J // / \ \ // E F I // // 1.如果出现node1和node2有继承关系,则返回高度较高节点的双亲节点 // // find_value // find_parent // int height1 = get_binarytree_height(node1); int height2 = get_binarytree_height(node2);
printf(" root,root2: root1: root4: \n"); printf(" A A \n"); printf(" / \\ / \\ \n"); printf(" B G B G B \n"); printf(" / \\ / \\ / \\ / \\ / \\ \n"); printf(" C D H J C D H J C D \n"); printf(" / \\ \\ /\\ /\\ \n"); printf(" E F I K L E F \n");
printf("\n**********************************************************************************\n"); printf("二.遍历二叉树:\n"); printf("pre order root:\n"); pre_order_print(root); printf("\n");
printf("pre order nr root:\n"); pre_order_print_nr(root); printf("\n");
printf("mid order root:\n"); mid_order_print(root); printf("\n");
printf("mid order nr root:\n"); mid_order_print_nr(root); printf("\n");
printf("last order root:\n"); last_order_print(root); printf("\n");
printf("last order nr root:\n"); last_order_print_nr(root); printf("\n");
printf("last order root1:\n"); last_order_print(root1); printf("\n");
printf("last order nr root1:\n"); last_order_print_nr(root1); printf("\n");
printf("level order root1:\n"); level_order_print(root1); printf("\n");
printf("mid order root :\n"); mid_order_print(root); printf("\n");
printf("mid order coped root2:\n"); mid_order_print_nr(root2); printf("\n");
//得到二叉树高度 printf("the height of root2:%d\n", get_binarytree_height(root2)); //得到二叉树节点个数 printf("the count of root2:%d\n", get_binarytree_node_count(root2)); //得到二叉树叶子节点个数 printf("the leaves count of root2:%d\n", get_binarytree_leaf_count(root2)); //得到二叉树的最大路径 printf("the largest dir count of root2:%d\n", get_largest_dir_count(root2)); //得到第n层二叉树的节点个数 printf("the %d level count is:%d\n", 3, get_binarytree_level_count(root, 3)); //得到二叉树镜像 printf("pre order root2:\n"); pre_order_print_nr(root2); swap_left_right(root2); printf("\nswap pre order root2:\n"); pre_order_print_nr(root2); printf("\n"); //二叉树的拷贝 root3 = copy_binary_tree(root1); printf("root3 = copy_binary_tree(root1)\n"); printf("mid order root1 :\n"); mid_order_print(root1); printf("\n"); printf("mid order root3 :\n"); mid_order_print(root3); printf("\n");
printf("\n**********************************************************************************\n"); printf("四.二叉树的性质:\n"); printf(" root, root2: root1,root3: root4: \n"); printf(" A | A A \n"); printf(" / \\ | / \\ / \\ \n"); printf(" B G | G B B G B \n"); printf(" / \\ / \\ | / \\ / \\ / \\ / \\ / \\ \n"); printf(" C D H J | J H D C C D H J C D \n"); printf(" / \\ \\ | / / \\ /\\ /\\ \n"); printf(" E F I | I F E K L E F \n");
//判断是否是满二叉树 if(is_full_binary_tree(root1) == TRUE){ printf("root1 is full!\n"); }else{ printf("root1 is not full!\n"); } //判断是否完全二叉树 if(is_complete_binary_tree(root1) == TRUE){ printf("root1 is complete!\n"); }else{ printf("root1 is not complete!\n"); } //判断是否平衡二叉树 if(is_balance_binary_tree(root1) == TRUE){ printf("root1 is balance!\n"); }else{ printf("root1 is not balance!\n"); } //判断二叉树是否包含 printf("mid order root :\n"); mid_order_print(root); printf("\n"); printf("mid order root4 :\n"); mid_order_print(root4); printf("\n"); if(is_include_tree(root, root4) == TRUE){ printf("root4 is include root!\n"); }else{ printf("root1 is not include!\n"); } //判断二叉树是否相等 if((equal = is_binarytree_equal(root1, root3)) == TRUE) { printf("root1 root3 two trees are equal!\n"); }
printf("\n**********************************************************************************\n"); printf("五.二叉树的查找\n"); //找到值所在节点 printf("mid order root :\n"); mid_order_print(root); printf("\n"); if((find = find_value(root, 'H')) == NULL){ printf("H is not found!\n"); }else{ printf("%c is found!\n", find->data); }
********************************************************************************** 一.1.创建二叉树 root,root2: root1: root4: A A / \ / \ B G B G B / \ / \ / \ / \ / \ C D H J C D H J C D / \ \ /\ /\ E F I K L E F
********************************************************************************** 二.遍历二叉树: pre order root: A B C D E F G H I J pre order nr root: A B C D E F G H I J mid order root: C B E D F A H I G J mid order nr root: C B E D F A H I G J last order root: C E F D B I H J G A last order nr root: C E F D B I H J G A last order root1: K L C E F D B H J G A last order nr root1: K L C E F D B H J G A level order root1: A B G C D H J K L E F
********************************************************************************** 三.二叉树的变量: mid order root : C B E D F A H I G J mid order coped root2: C B E D F A H I G J the height of root2:4 the count of root2:10 the leaves count of root2:5 the largest dir count of root2:6 the 3 level count is:4 pre order root2: A B C D E F G H I J swap pre order root2: A G J H I B D F E C root3 = copy_binary_tree(root1) mid order root1 : K C L B E D F A H G J mid order root3 : K C L B E D F A H G J
********************************************************************************** 四.二叉树的性质: root, root2: root1,root3: root4: A | A A / \ | / \ / \ B G | G B B G B / \ / \ | / \ / \ / \ / \ / \ C D H J | J H D C C D H J C D / \ \ | / / \ /\ /\ E F I | I F E K L E F root1 is not full! root1 is complete! root1 is balance! mid order root : C B E D F A H I G J mid order root4 : C B D root4 is include root! root1 root3 two trees are equal!
********************************************************************************** 五.二叉树的查找 mid order root : C B E D F A H I G J H is found! (B and I) parent is:A