设计一个函数,输入一颗二叉树,要使得二叉树中每个结点的左子树的结点个数大于等于其右子树结点个数。如果二叉树中某个结点不具有这个特征,需要交换其左右子树。要求:①设计一组二叉树ADT的基本操作,要给出每个基本操作的名字,输入,输出和功能描述。②声明一个函数,这个函数的功能是求二叉树结点的个数。设计并定义一个合适点的函数
时间: 2024-02-13 12:05:31 浏览: 63
(1)二叉树的建立 (2)求出二叉树的高度 (3)求出二叉树结点个数 (4)先序遍历递归实现 (5)先序遍历非递归实现 (6)求出二叉树叶子结点个数
3星 · 编辑精心推荐
1. 二叉树ADT的基本操作:
- createBinaryTree(): 创建一颗二叉树,输入为一个数组,输出为一个二叉树的根节点;
- swapLeftRight(): 交换某个节点的左右子树,输入为该节点,输出为交换后的根节点;
- countNodes(): 计算二叉树中节点的个数,输入为二叉树的根节点,输出为节点的个数。
2. 求二叉树结点个数的函数:
```
int countNodes(BinaryTreeNode* root) {
if(root == NULL) {
return 0;
}
return 1 + countNodes(root->left) + countNodes(root->right);
}
```
3. 使得二叉树中每个结点的左子树的结点个数大于等于其右子树结点个数的函数:
```
BinaryTreeNode* balanceBinaryTree(BinaryTreeNode* root) {
if(root == NULL) {
return NULL;
}
int leftNodes = countNodes(root->left);
int rightNodes = countNodes(root->right);
if(leftNodes < rightNodes) {
return swapLeftRight(root);
}
balanceBinaryTree(root->left);
balanceBinaryTree(root->right);
return root;
}
```
阅读全文