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遍历输出特定层数据。
部分参考自二叉树常用算法总结