本文所指二叉树 皆为普通二叉树,下同
二叉树的定义
在介绍相关操作时,请记住一点,
二叉树构建核心思想是递归,
typedef char treeNodeType;
typedef struct _treeNode{
struct _treeNode* left;
struct _treeNode* right;
treeNodeType value;
}treeNode;
相关操作有:
1 二叉树的先序,中序,后续遍历的递归版,使用栈循环版,还有使用队列层序遍历版
2 求二叉树某层的节点数,求二叉树的总节点数,求二叉树叶子节点数,
3 求某节点的左右子节点 或者父节点
3 将二叉树镜像翻转
4 判断一颗二叉树是否是完全二叉树
5 在二叉树中查找某节点
6 二叉树的深拷贝(clone)
7通过前序有标记空节点结果 构建二叉树
8 通过前序中序遍历构建二叉树
这篇博客主要解决加粗部分,详细代码请参见
其中有完整头文件,源文件,和单元测试.
感谢!
剩余操作请参见
(c语言实现)二叉树的相关操作 (一) 二叉树的递归遍历和循环遍历
(c语言实现)二叉树的相关操作 (三) 通过遍历构建二叉树的两种类型
二叉树节点的计算
求二叉树某层节点数
在求某层节点时,首先需要遍历所有树,这里采用先序遍历,
在遍历时,创建一个标记变量,记录当前二叉树的深度,
当深度等于要求的层数而且节点非空时返回1;
并且递归的求解某节点左子树和右子树满足条件的节点
size_t TreeKLevelSize(treeNode* root, int k)
{
if( root == NULL || k == 0)
return -1;
int count = 1;
return _TreeKLevelSize(root,k,count);
}
size_t _TreeKLevelSize(treeNode* root,int k,int deep_count)
{
if(root == NULL || deep_count > k)
return 0;
if(k == deep_count)
return 1;
return _TreeKLevelSize(root->left,k,deep_count + 1)
+ _TreeKLevelSize(root->right,k,deep_count + 1);
}
求树的高度
对于一棵树,它的高度等于左子树的高度和右子树高度中最高的那一个,
所以我们可以递归的求解左子树和右子树中最高的那一个
size_t TreeHeight(treeNode* root)
{
if(root == NULL)
return 0;
int le