1.把一棵二叉树转换为它的镜像树。
void mirror_tree ( TreeNode * root)
{ if ( root== NULL ) return ; TreeNode * temp= root-> right; root-> right= root-> left; root-> left= temp; mirror_tree ( root-> right) ; mirror_tree ( root-> left) ; }
2、输入两棵二叉树A,B,判断B是不是A的子结构(我们约定空树不是任意一个树的子结构)。
bool _is_zi ( TreeNode * s1, TreeNode * s2)
{ if ( s1== NULL && s2== NULL ) return true; if ( s1!= NULL && s2== NULL ) return false; if ( s1== NULL && s2!= NULL ) return false; if ( s1-> date!= s2-> data) return false; return _is_zi ( s1-> left, s2-> left) && _is_zi ( s1-> right, s2-> right) ; } bool is_zi ( TreeNode * root, TreeNode * node)
{ if ( root== NUll ) return false; if ( root-> data== node-> data) { bool a= _is_zi ( root, node) ; if ( bool) return true; } bool left= is_zi ( root-> left, node) ; bool right= is_zi ( root-> right, node) ; return right|| left
}
3、将一棵有序二叉树转换成一个有序的双向链表 。
void * add_tail_node ( TreeNode * * head, TreeNode * node)
{ if ( * head== NULL ) { * head= node; } else { ( * head) -> left-> right= node; node-> left= ( * head) -> left; } ( * head) -> left= node; }
void * _tree_to_list ( TreeNode * root , TreeNode * * head)
{ if ( root== NULL ) return ; _tree_to_list ( root-> let, node) ; add_tail_node ( head, root) _tree_to_list ( root-> right, head) ;
}
TreeNode * tree_to_list ( TreeNode * root)
{ TreeNode * head= NULL ; _tree_to_list ( root-> left, & head) ; head-> left-> right= head;
}
4、计算出有序二叉树中倒数第K个大的数。
bool _access ( TreeNode * root, int * k, int index, int * ptr) { if ( NULL == root) return false; bool rflag = _access ( root-> right, k, index, ptr) ; if ( rflag) return true; if ( ( * k) ++ == index) { * ptr = root-> data; return true; } return _access ( root-> left, k, index, ptr) ;
}
5、判断一个二叉树是否对称。
bool _is_sym ( TreeNode * root1, TreeNode * root2)
{ if ( root1== NULL && root2== NULL ) return true; if ( root1== NULL && root2!= = NULL ) return false; if ( root1== ! NULL && root2== NULL ) return false; if ( root1-> data!= root2-> data) return false; bool lh= _is_sym ( root1-> left, root2-> right) ; bool rh= _is_sym ( root2-> right, root2-> left) ; return lh&& rh
}
bool is_sym ( TreeNode * root)
{ _is_sym ( root, root) ; }
6、请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
TreeNode * find_node ( TreeNode * root, TREE_TYPE data)
{ if ( NULL == root) { return NULL ; } if ( data == root-> data) { return root; } TreeNode * leftResult = find_node ( root-> left, data) ; if ( leftResult != NULL ) { return leftResult; } TreeNode * rightResult = find_node ( root-> right, data) ; if ( rightResult != NULL ) { return rightResult; } return NULL ;
}
void printf_zhi ( TreeNode * root)
{ if ( NULL == root) return ; ListStack * stack1 = create_Link_stack ( ) ; ListStack * stack2 = create_Link_stack ( ) ; push_Link_stack ( stack1, root-> data) ; bool left_to_right = true; while ( ! empty_list_stack ( stack1) || ! empty_list_stack ( stack2) ) { ListStack * current_stack = left_to_right ? stack1 : stack2; ListStack * next_stack = left_to_right ? stack2 : stack1; while ( ! empty_list_stack ( current_stack) ) { TREE_TYPE data = top_list_stack ( current_stack) ; printf ( "%c " , data) ; pop_List_stack ( current_stack) ; TreeNode * current_node = find_node ( root, data) ; if ( current_node != NULL ) { if ( left_to_right) { if ( current_node-> left != NULL ) push_Link_stack ( next_stack, current_node-> left-> data) ; if ( current_node-> right != NULL ) push_Link_stack ( next_stack, current_node-> right-> data) ; } else { if ( current_node-> right != NULL ) push_Link_stack ( next_stack, current_node-> right-> data) ; if ( current_node-> left != NULL ) push_Link_stack ( next_stack, current_node-> left-> data) ; } } } left_to_right = ! left_to_right; }
}