1.求节点数据差的最大绝对值
假设节点存储为int数据, 遍历二叉树,找出节点数据差的最大绝对值。题设可以转换为求最大最小问题,最大值-最小值的差即是所求。求最大最小值的子函数如下:
void decision(NodePoint Root,int &max,int &min)//前序遍历获得最大、最小值
{
if(!Root);
else{
if (Root->data>max)
max=Root->data;
else if(Root->data<min)
min=Root->data;
decision(Root->leftchild,max,min);
decision(Root->rightchild,max,min);
}
}
main函数中相关变量的声明和初始化如下
int max=Root->data;
int min=Root->data;
decision(Root,max,min);
cout<<abs(max-min)<<endl;
二叉树的创建点击
2.递归法求高度
int depth(NodePoint Root)
{
if(!Root)
return -1;//递归结束条件
else
{int left=depth(Root->leftchild);
int right=depth(Root->rightchild);
return left>right?left+1:right+1;}
}
二叉树的高度指最大层次。层次从0开始依次向下计数。
3.递归法输出特定层数据
思路很简单,嵌套遍历,当level=0,即倘若某个节点位于目标层,递归截至并输出。
void RecursivePrintAtLevel(NodePoint root, int level)//打印特定层,从0开始计层
{
if(level<0||!root);//递归截至条件1
else if(level==0)//递归截至条件2
cout<<root->data<<" ";
else
{RecursivePrintAtLevel(root->leftchild,level-1);
RecursivePrintAtLevel(root->rightchild,level-1);}
}
4.层次法遍历逐层输出数据
即从0层开始,从左到右遍历输出数据。此处使用了队列queue。注意头文件#include <queue>。队列尊崇“先进先出”。push()添加到队尾,pop()弹出队首,front()输出队首。
void LevelTraverse(NodePoint Root)
{
queue<NodePoint> q;
while(Root||!q.empty())
{
if(!q.empty())
{Root=q.front();q.pop();}
cout<<Root->data<<" ";
if(Root->leftchild) q.push(Root->leftchild);
if(Root->rightchild) q.push(Root->rightchild);
Root=NULL;
}
}
层次法还有一种思路,先用2求出高度,再使用3遍历输出特定层数据。
部分参考自二叉树常用算法总结