有序二叉树:
左子树的数据小于根,右子树的数据大于等于根,这种树称为有序二叉树、二叉搜索树、二叉排序树
注意:这种树的节点需要频繁地插入、删除,因此不适合顺序存储
注意:插入、删除都要保证有序
有序二叉树的中序遍历都要保证有序,所以有序二叉树也是一种排序算法,查找又天然是二分查找
常见的题型:
- 1、把一棵二叉树转换为它的镜像树。
- 2、输入两棵二叉树A,B,判断B是不是A的子结构(我们约定空树不是任意一个树的子结构)。
- 3、将一棵有序二叉树转换成一个有序的双向链表。
- 4、计算出有序二叉树中倒数第K个大的数。
- 5、判断一个二叉树是否对称。
- 6、请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
// 有序二叉树
typedef struct TreeNode
{
int data;
struct TreeNode* left;
struct TreeNode* right;
}TreeNode;
TreeNode* create_tree_node(int data)
{
TreeNode* node = malloc(sizeof(TreeNode));
node->data = data;
node->left = NULL;
node->right = NULL;
return node;
}
void _insert_tree(TreeNode** root,TreeNode* node)
{
if(NULL == *root)
{
*root = node;
return;
}
if(node->data < (*root)->data)
_insert_tree(&((*root)->left),node);
else
_insert_tree(&((*root)->right),node);
}
// 添加
void insert_tree(TreeNode** root,int data)
{
_insert_tree(root,create_tree_node(data));
}
// 中序
void ldr_show(TreeNode* root)
{
if(NULL == root) return;
ldr_show(root->left);
printf("%d ",root->data);
ldr_show(root->right);
}
void dlr_show(TreeNode* root)
{
if(NULL == root) return;
printf("%d ",root->data);
dlr_show(root->left);
dlr_show(root->right);
}
void lrd_show(TreeNode* root)
{
if(NULL == root) return;
lrd_show(root->left);
lrd_sho