IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 设一棵二叉树以二叉链表表示,试以成员函数形式编写有关二叉树的递归算法: -> 正文阅读

[数据结构与算法]设一棵二叉树以二叉链表表示,试以成员函数形式编写有关二叉树的递归算法:

设一棵二叉树以二叉链表表示,试以成员函数形式编写有关二叉树的递归算法:

(1) 统计二叉树中度为1的结点个数。

(2) 统计二叉树中度为2的结点个数。

(3) 统计二叉树中度为0(叶结点)的结点个数。

(4) 统计二叉树的高度。

(5) 统计二叉树的宽度,即在二叉树的各层上,具有结点数最多的那一层上结点总数。???

?

(6) 从二叉树中删去所有叶结点。

(7) 计算二叉树中指定结点 *p?所在层次。

(8) 计算二叉树中各结点中的最大元素的值。

(9) 以前序次序输出一棵二叉树所有结点的数据值及结点所在层次。

?

?

【解答】

(1)666 统计二叉树中度为1的结点个数。
template <class Type> 
int?BinaryTree<Type> ::?Degrees1 ( BinTreeNode<Type>?* t ) const {
	???if ( t == NULL ) return 0;
	???if ( t->leftChild != NULL &&?t->rightChild == NULL ||
			?t->leftChild == NULL &&?t->rightChild != NULL ) 
            return?1;
	???return?Degrees1 ( t->leftChild, k ) + Degrees1 ( t->rightChild, k );
	}

(2) 统计二叉树中度为2的结点个数。
template <class Type> 
int?BinaryTree<Type> ::?Degrees2 ( BinTreeNode<Type>?* t )?const?{
	???if ( t == NULL ) return?0;
	???if ( t->leftChild != NULL &&?t->rightChild != NULL ) 
            return 1;
??    ?return?Degrees2 ( t->leftChild, k ) + Degrees2 ( t->rightChild, k );
	}

	(3) 统计二叉树中度为0(叶结点)的结点个数。
template <class Type> 
int?BinaryTree<Type> ::?leaves ( BinTreeNode<Type>?* t ) const?{
   if ( t == NULL )?return 0;
???if ( t->leftChild == NULL &&?t->rightChild == NULL ) 
        return?1;
???return?leaves ( t->leftChild ) + leaves ( t->rightChild );
}

	(4) 统计二叉树的高度。
template <class Type>
int BinaryTree<Type>?::?height ( BinTreeNode<Type>?*t )?{
???if ( t ==?NULL ) return?–1;
???int?hl = height ( t->leftChild );
???int hr = height ( t->rightChild );
???return?1+ ( hl > hr ??hl :?hr );
}

(5) 统计二叉树的宽度,即在二叉树的各层上,具有结点数最多的那一层上结点总数。
本题的想法是:先用前序遍历求出每一层的宽度,再求出最大宽度,即树的宽度。
①?求每一层宽度的算法:
template <class Type>?
int BinaryTree<Type>?::?levelNumber ( BinTreeNode<Type>?*t, int a[ ], int?h )?{
//求以*t为根的子树中各层的宽度, 存放在a[ ]?中, h是?*t所在层次号,
//要求在主程序中将a[h]初始化为0
???if?( t != NULL ) {		//若空树, 不统计
	?a[h] += 1;		//第h层宽度加一
	?levelNumber ( t->leftChild, a, h+1 );	//递归统计左子树中各层宽度
	?levelNumber ( t->rightChild, a, h+1 );//递归统计右子树中各层宽度
	???}
	}
② 求二叉树的宽度的算法
template <class Type>
int BinaryTree<Type>?::?width ( BinTreeNode<Type>?*t )?{
???int a[n+1], h = 0, i, wid;
	???for?( i = 0; i <= n; i++ ) 
            a[i] = 0;//统计数组a[ ]初始化
	???levelNumber ( t, a, h );	//调用求各层宽度的算法
	???wid = a[0];
	???for ( i = 1; i <= n; i++ )
		?if ( a[i] > wid ) wid = a[i];
	???return wid;
	}

?(6) 从二叉树中删去所有叶结点。
template <class Type>
void BinaryTree<Type>?:: defoliate ( BinTreeNode<Type> *&?t ) {
???if ( t ==?NULL ) return;
???if ( t->leftChild ==?NULL &&?t->rightChild ==?NULL ) 
?       { delete?t;??t = NULL; }
???else { 
?       defoliate ( t->leftChild );
?       defoliate ( t->rightChild );
	???}
}

(7) 计算二叉树中指定结点 *p?所在层次。
template <class Type>
int?BinaryTree<Type>?::?level ( BinTreeNode<Type>?* t, BintreeNode<Type>?*p ) {
???if ( t ==?NULL ) return?-1;
???if ( t ==?p )?return 0;
???if ( ( leftSubTreelevel = level ( t->leftChild, p ) ) > -1 )?
?         return 1 + leftSubTreelevel;
???if ( ( rightSubTreelevel = level ( t->rightChild, p ) ) > -1 ) 
?         return?1 + rightSubTreelevel;
???return?-1;
}

	(8) 计算二叉树中各结点中的最大元素的值。
template <class Type> 
Type?BinaryTree<Type> ::?MaxValue ( BinTreeNode<Type>?* t, Type?max ) {
	???if ( t != NULL ) {
		??if ( t->data > max ) max = t->data;
		??max = MaxValue ( t->leftChild, max );
		??max = MaxValue ( t->rightChild, max );
	???}
	???return?max;
	}

	(9) 以前序次序输出一棵二叉树所有结点的数据值及结点所在层次。
#include <iostream.h>
template <class Type>
void?BinaryTree <Type> :: nodePrint ( BinTreeNode<Type> *t, int?i ) {
???if ( t != NULL )?{
??        cout <<?t->data <<?“,” << i << endl;
??        nodePrint ( t->leftChild, i+1 );
?        ?nodePrint ( t->rightChild, i+1 );
???????}
	}


?

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-12-06 15:30:50  更:2021-12-06 15:33:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 14:23:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码