二叉树结构类型定义
// 定义二叉树节点结构体
typedef int TElemType; // 假设数据类型为int,可根据需要修改
typedef struct BiTNode {TElemType data;struct BiTNode* lchild, * rchild;
} BiTNode, * BiTree;
计算二叉树总节点个数
思想:
递归求解法:
(1)如果二叉树为空,节点个数是0
(2)如果二叉树不为空,二叉树节点个数 = 左子树节点个数 + 右子树节点个数 + 1
程序设计
int TreeNodeNumall(BTNode * root)
{if(root== NULL) // 递归出口return 0;return TreeNodeNumall(root->lchild) + TreeNodeNumall(root->rchild) + 1;
}
计算度为0节点(叶子节点)的个数
思想:
求度为0(叶子节点)节点的个数 递归解法:
(1)如果二叉树为空,返回0
(2)如果二叉树不为空且左右子树为空,返回1
(3)如果二叉树不为空,且左右子树不同时为空,返回左子树中叶子节点个数加上右子树中叶子节点个数
程序设计
int TreeNodeNum0(BTNode * root)
{if(root== NULL)return 0;if(root->lchild== NULL && root->rchild== NULL)return 1;return TreeNodeNum0(root->lchild) + TreeNodeNum0(root->rchild);
}
计算度为1节点个数
思想:
度为1(只有一个子节点)的节点个数,递归解法与求叶子节点个数类似,但需要判断当前节点的左右子树是否只有一个不为空。具体步骤如下:
- 如果二叉树为空,返回0。
- 如果二叉树不为空且只有一个子树(即只有左子树或右子树不为空),返回1。
- 如果二叉树不为空,且左右子树均不为空,递归计算左子树和右子树中度为1的节点个数。
程序设计
int TreeNodeNum1(BTNode * root)
{if (root == NULL)return 0;// 只有一个子节点(左子树或右子树为空)if ((root->lchild == NULL && root->rchild != NULL) || (root->lchild != NULL && root->rchild == NULL))return 1;// 递归计算左右子树中的度为1的节点个数return TreeNodeNum1(root->lchild) + TreeNodeNum1(root->rchild);
}
计算度为2节点个数
思想:
要求度为2(即左右子树都不为空)的节点个数,递归解法的思路如下:
- 如果二叉树为空,返回0。
- 如果二叉树不为空且左右子树都不为空,返回1。
- 如果二叉树不为空,且左右子树不同时为空,递归计算左子树和右子树中度为2的节点个数。
程序设计
int TreeNodeNum2(BTNode * root)
{if (root == NULL)return 0;// 只有左右子树都不为空时,说明度为2if (root->lchild != NULL && root->rchild != NULL)return 1;// 递归计算左右子树中的度为2的节点个数return TreeNodeNum2(root->lchild) + TreeNodeNum2(root->rchild);
}
判断两棵树是否相等
思想:
判断两棵二叉树是否相等,主要有以下几个步骤:
递归比较:如果两棵树的根节点的数据相等,则继续递归地比较左右子树。
递归终止条件:
- 如果两棵树都为空,则认为它们相等。
- 如果一棵树为空,另一棵树不为空,则认为它们不相等。
- 如果根节点的数据不同,则认为它们不相等。
递归推进:如果根节点数据相同,继续比较左子树和右子树
程序设计
int areTreesEqual(BiTree tree1, BiTree tree2) {// 如果两棵树都为空,认为相等if (tree1 == NULL && tree2 == NULL) {return 1;}// 如果一棵树为空,另一棵树不为空,则不相等if (tree1 == NULL || tree2 == NULL) {return 0;}// 如果根节点的数据不相等,则不相等if (tree1->data != tree2->data) {return 0;}// 递归判断左子树和右子树是否相等return areTreesEqual(tree1->lchild, tree2->lchild) && areTreesEqual(tree1->rchild, tree2->rchild);