一:什么是链式二叉树
二:链式二叉树实现
三:链式二叉树遍历
链式二叉树遍历:前,中,后序遍历
层序遍历
一:什么是链式二叉树
链式二叉树重点在二叉树,本质是二叉树,什么是二叉树呢?
链式二叉树要用到链表结构表示的
实现链式二叉树,首先观察二叉树,一个二叉树由根节点,左子树,右子树构成
我们先要申请一块空间吧,用来链式二叉树吧,申请空间代码之前写了许多遍,这里不在赘述了
有了二叉树占据空间,然后往里头放数据呗!
求节点个数
用到递归思想:
根节点进入二叉树,先递归根节点1的左子树,在递归左子树的左子树,重复步骤一直递归直到递归到空节点,空节点不递归呗!然后返回节点,取节点,在递归它的右子树,递归完返回节点,继续往回走,回到上一个节点,取节点,在递归它的右子树,当右子树不为空时,取右子树的节点,然后回溯到节点,重复以上步骤,回到最初根节点1,在递归它的右子树,往下递归,递归到空回溯到前一个节点,之后重复之前的递归操作,递归后,不为空取节点,为空不取节点
公式满足、
1+left(左子树节点)+right(右子树节点)
这个是代码
你看,我申请了四个节点,它打印了4,那就是正确的喽
求叶子节点个数
求叶子节点个数,说白了还是求节点个数,依然运用到递归思想,它的递归过程跟求节点个数的递归差不多,有点不一样的着,请看下图
左子树,右子树是跟节点两个分支呗,分支上的节点是枝干上的叶子呗,即只要求枝干上的叶子,方可求出叶子节点呗
这是代码
写代码的时候要注意:当这课树为空时,一个节点没有。树中出现空节点,要做判断,要是左节点为空同时右子树为空这样是不计数的
int BinaryTreeLeafSize(BTNode* root)
{
if (root == NULL)
{
return 0;
}
if (root->left == NULL && root->right == NULL)
{
return 1;
}
return BinaryTreeLeafSize(root->left) + BinaryTreeLeafSize(root->right);
}
二叉树第k层结点个数
求二叉树第k层节点个数,重点是第k层,提到层会想用到二叉树里的层吧!当然这里用上了。
二叉树查找值x的节点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{
if (root == NULL)
{
return NULL;
}
if (root->data == x)
{
return root;
}
BTNode* leftFind = BinaryTreeFind(root->left, x);
if (leftFind)
{
return leftFind;
}
BTNode* rightFind = BinaryTreeFind(root->right, x);
if (rightFind)
{
return leftFind;
}
return NULL;
}
二叉树销毁
层序遍历
接下来介绍特殊的二叉树吧
分别是满二叉树,完全二叉树
那又如何实现完全二叉树呢?
不卖关子,这里直接用队列实现完全二叉树