设一棵二叉树以二叉链表表示,试以成员函数形式编写有关二叉树的递归算法:
Posted Roam-G
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设一棵二叉树以二叉链表表示,试以成员函数形式编写有关二叉树的递归算法:相关的知识,希望对你有一定的参考价值。
设一棵二叉树以二叉链表表示,试以成员函数形式编写有关二叉树的递归算法:
(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 );
以上是关于设一棵二叉树以二叉链表表示,试以成员函数形式编写有关二叉树的递归算法:的主要内容,如果未能解决你的问题,请参考以下文章
如何在数据结构中,以二叉链表为存储结构,建立一棵二叉树,输出其先序,中序,后序遍历序列,统计其叶子
已知一颗二叉链表表示二叉树T ,编写函数,判断T是不是为完全二叉树。先
假设二叉树以二叉链表作为存储结构,试设计一个计算二叉树叶子结点树的递归算 法 要求用递归算法啊