前言
树是一种十分重要的基础数据结构。很多实际问题都会抽象成树来解决。而这篇文章要讲的二叉树则是树中最基本又很重要的一种特殊树。它只的是每个节点的度不大于2的树。
基于二叉树还有很多衍生的树。查找树,红黑树,平衡树等等等等。
基础思路
二叉树可以很形象的看做是一个递归的产物。所以二叉树的问题,基本都可以用递归来解决。无论一颗二叉树是什么样子的。他都可以看做三部分:本节点,左子树,右子树。
左子树也可以看成本节点,左子树,右子树。这样的结构。
就像图片上这样。所以一个树的节点需要三部分。保存本节点的数据。指向左节点(左子树),指向右节点(右子树)。当不存在左节点(左子树)或者右节点(右子树)时,则指向空就好。
于是我们就可以构造一个二叉树所需要的节点。
typedef struct TreeNode
{
BTtype _val;
struct TreeNode* _left;
struct TreeNode* _right;
}BinaryTreeNode;
当然,根据需要一个节点也可以保存很多数据,比如一个学生的姓名学号生日电话等等等。
二叉树的建立
二叉树有很多种搭建方法。在不同的场景可以有用不同的方法。虽然二叉树是一种非线性的结构。我们依然可以使用数组来保存。
如果将根节点看做第零个节点的话,他的左孩子节点的下标等于父节点的下标的二倍加一,右孩子节点的下标等于父节点的下标的二倍加二。这样比较简单我就不贴代码了。
我们还是利用在上面建的节点。利用链式构成二叉树。我们确定一个根节点。然后让比根节点小的去左节点,比根节点大的去右节点。这样构成的树是一颗二叉查找树。当我们用中序遍历时,遍历结果就是升序的。
BinaryTreeNode* InitTree(BTtype *a,int nums) //建树
{
BinaryTreeNode* root;
root = NULL;
BinaryTreeNode* cur,*prev;
for (int i = 0; i < nums; ++i)
{
BinaryTreeNode* newnode = (BinaryTreeNode*)malloc(sizeof(BinaryTreeNode));
newnode->_val = a[i];
newnode