您的位置:首页 > 理论基础 > 数据结构算法

数据结构学习4--树(二)之排序二叉树(上)

2015-09-18 16:38 288 查看

1 基本概念

只要在二叉树的基本定义上增加两个基本条件就可以了:(1)所有左子树的节点数值都小于此节点的数值;(2)所有右节点的数值都大于此节点的数值。
typedef struct _TREE_NODE
{
int data;
struct _TREE_NODE* parent;
struct _TREE_NODE* left_child;
struct _TREE_NODE* right_child;
}TREE_NODE;




2 基本操作

2.1 创建二叉树节点

TREE_NODE* create_tree_node(int data)
{
TREE_NODE* pTreeNode = NULL;
pTreeNode = (TREE_NODE*)malloc(sizeof(TREE_NODE));
memset(pTreeNode, 0, sizeof(TREE_NODE));
pTreeNode->data = data;
return pTreeNode;
}


2.2 数据查找

TREE_NODE* find_data_in_tree_node(const TREE_NODE* pTreeNode, int data)
{
//数据合法性
if(NULL == pTreeNode)
return NULL;

if(data == pTreeNode->data)
return (TREE_NODE*)pTreeNode;
else if(data < pTreeNode->data)
return find_data_in_tree_node(pTreeNode->left_child, data);
else
return find_data_in_tree_node(pTreeNode->right_child, data);
}
分析:如果数值比节点数据小,那么向左继续遍历;反之向右继续遍历。如果遍历下去遇到了NULL指针,只能说明当前的数据在二叉树中还不存在。

2.3 统计节点总数

int count_node_number_in_tree(const TREE_NODE* pTreeNode)
{
if(NULL == pTreeNode)
return 0;

return 1 + count_node_number_in_tree(pTreeNode->left_child)
+ count_node_number_in_tree(pTreeNode->right_child);
}


分析:先遍历左节点,一直遍历到最后的叶子,叶子的左节点为空,返回0,右节点也是空,还是0,这样节点数就是1,再返回上一节点,以此类推。



2.4 从小到大打印节点的数据

void print_all_node_data(const TREE_NODE* pTreeNode)
{
if(pTreeNode){
print_all_node_data(pTreeNode->left_child);
printf("%d\n", pTreeNode->data);
print_all_node_data(pTreeNode->right_child);
}
}
分析:首先打印左子树的节点,然后打印本节点的数值,最后打印右子树节点的数值,这样所有节点的数值就都可以打印出来了。

2.5 统计树的高度

int calculate_height_of_tree(const TREE_NODE* pTreeNode)
{
int left, right;
if(NULL == pTreeNode)
return 0;

left = calculate_height_of_tree(pTreeNode->left_child);
right = calculate_height_of_tree(pTreeNode->right_child);
return (left > right) ? (left + 1) : (right + 1);
}
分析:树的高度其实是指所有叶子节点中,从根节点到叶子节点的最大高度可以达到多少。当然,程序中表示得已经很明白了,如果节点为空,那么很遗憾,节点的高度为0;反之如果左子树的高度大于右子树的高度,那么整个二叉树的节点高度就是左子树的高度加上1;如果右子树的高度大于左子树的高度,那么整个二叉树的高度就是右子树的高度加上1。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: