一步一步写算法(之排序二叉树)
来源:互联网 发布:赵薇背后的势力 知乎 编辑:程序博客网 时间:2024/06/05 11:19
http://blog.csdn.net/feixiaoxing/article/details/6860493
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
前面我们讲过双向链表的数据结构。每一个循环节点有两个指针,一个指向前面一个节点,一个指向后继节点,这样所有的节点像一颗颗珍珠一样被一根线穿在了一起。然而今天我们讨论的数据结构却有一点不同,它有三个节点。它是这样定义的:
- typedef struct _TREE_NODE
- {
- int data;
- struct _TREE_NODE* parent;
- struct _TREE_NODE* left_child;
- struct _TREE_NODE* right_child;
- }TREE_NODE;
既然看到了节点的定义,那么我们并可以得到,只要按照一定的顺序遍历,可以把二叉树中的节点按照某一个顺序打印出来。那么,节点的创建、查找、遍历是怎么进行的呢,二叉树的高度应该怎么计算呢?我们一一道来。
1)创建二叉树节点
- TREE_NODE* create_tree_node(int data)
- {
- TREE_NODE* pTreeNode = NULL;
- pTreeNode = (TREE_NODE*)malloc(sizeof(TREE_NODE));
- assert(NULL != pTreeNode);
- memset(pTreeNode, 0, sizeof(TREE_NODE));
- pTreeNode->data = data;
- return pTreeNode;
- }
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);
- }
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);
- }
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);
- }
- }
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);
- }
总结:
1)二叉树是所有树的基础,后续的平衡二叉树、线性二叉树、红黑树、复合二叉树、b树、b+树都以此为基础,希望大家好好学习;
2)二叉树很多的操作是和堆栈紧密联系在一起的,如果大家暂时理解不了递归,可以用循环或者堆栈代替;
3)实践出真知,大家可以自己对排序二叉树的代码多多练习。不瞒大家说,我个人写平衡二叉树不下20多遍,即使这样也不能保证每次都正确;即使这样,我每次写代码的都有不同的感觉。
【预告: 下面一篇博客介绍平衡二叉树的插入和删除】
0 0
- 一步一步写算法(之排序二叉树)
- 一步一步写算法(之排序二叉树插入)
- 一步一步写算法(之排序二叉树删除-1)
- 一步一步写算法(之排序二叉树删除-2)
- 一步一步写算法(之排序二叉树删除-3)
- 一步一步写算法(之排序二叉树线索化)
- 一步一步写算法(之排序二叉树)
- 一步一步写算法(之排序二叉树插入)
- 一步一步写算法(之排序二叉树删除-1)
- 一步一步写算法(之排序二叉树删除-2)
- 一步一步写算法(之排序二叉树删除-3)
- 一步一步写算法(之排序二叉树线索化)
- 一步一步写算法(之排序二叉树)
- 一步一步写算法(之排序二叉树)
- 一步一步写算法(之排序二叉树)
- 一步一步写算法(之排序二叉树)
- 一步一步写算法(之排序二叉树)
- 一步一步写算法(之排序二叉树的保存和加载)
- 帮助文档生成
- 项目3——时间类1
- 编程练习一————贪心算法
- webservice的两种调用方式
- HTML学习笔记(十一)内联框架
- 一步一步写算法(之排序二叉树)
- 多表连接查询(内,外,交叉连接)
- 黄芪丹参饮,老程序员可试试
- 22. Generate Parentheses 回溯算法
- 沼泽鳄鱼(矩阵乘法)
- <C#入门经典>学习笔记2之控制流程
- 【笔试/面试】—— 奇葩 C/C++ 语法题
- 6.2 Android Framework - ShapeDrawable
- Linux常考指令(更新中)