二叉树(3):对二叉树数的操作 1.求节点数据差的最大绝对值 2.递归法求高度 3.递归法输出特定层数据 4.层次法遍历逐层输出数据

           假设节点存储为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遍历输出特定层数据。

    

部分参考自二叉树常用算法总结