码迷,mamicode.com
首页 > 其他好文 > 详细

编程之美 求二叉树中节点之间最大的距离

时间:2015-08-27 21:19:46      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:

#include<iostream>
using namespace std;
//二叉树 节点结构
typedef struct TNODE_
{
	int data;
	struct TNODE_*left;
	struct TNODE_*right;
}TNode;
//获取树的高度=路径+1(最长路径经过的边数+1)
int GetLRDistance(TNode*t)
{
	int len=0;
	if(t==NULL)
	{
		return 0;
	}else{
		int lenL=GetLRDistance(t->left);
		int lenR=GetLRDistance(t->right);
		len=(lenL>lenR)?lenL:lenR;
		len+=1;
		//return (len+1);
	}
	return len;
}

//获取树中节点之间的最大距离(可能是两个叶子节点 或叶子节点与根节点)

int GetMaxDistance(TNode*t)
{
	int distance=0;
	if(t==NULL)
	{
		distance=0;
		//return 0;
	}else if(t->left!=NULL && t->right==NULL){
		//判断是否是子树的两个叶子节点之间,还是其中的一个叶子节点与根节点
	    int temp_distance=GetMaxDistance(t->left);
		int max_RootLeft=GetLRDistance(t->left);
        distance=temp_distance>max_RootLeft?temp_distance:max_RootLeft;

	}else if(t->left==NULL && t->right!=NULL){
		//判断是否是子树的两个叶子节点之间,还是其中的一个叶子节点与根节点
	    int temp_distance=GetMaxDistance(t->right);
		int max_RootLeft=GetLRDistance(t->right);
        distance=temp_distance>max_RootLeft?temp_distance:max_RootLeft;	

	}else if(t->left!=NULL && t->right!=NULL){
		//判断是否左右子树之间(左子树的高度+右子树的高度),还是左子树的节点之间,还是右子树的节点之间
		int maxLeft=GetMaxDistance(t->left);
		int maxRight=GetMaxDistance(t->right);

		int max_RootLeft=0,max_RootRight=0;

        max_RootLeft=GetLRDistance(t->left);
        max_RootRight=GetLRDistance(t->right);

		if(maxRight<maxLeft)distance=maxLeft;
		else distance=maxRight;
		int temp=max_RootRight+max_RootLeft;
		if(temp>distance)distance=temp;
	}
	return distance;
}
void OutputF(TNode*t)
{
	if(t!=NULL)
		cout<<t->data<<" ";
	else return;
	OutputF(t->left);
	OutputF(t->right);
}
void Test()
{
	TNode*t=new TNode();
	t->data=1;
	t->left=t->right=NULL;

	TNode*t1=new TNode();
	t1->data=2;
	t1->left=t1->right=NULL;
    t->left=t1;

	TNode*t2=new TNode();
	t2->data=3;
	t2->left=t2->right=NULL;
	t1->left=t2;

	TNode*t3=new TNode();
	t3->data=4;
	t3->left=t3->right=NULL;
	t->right=t3;

	TNode*t4=new TNode();
	t4->data=5;
	t4->left=t4->right=NULL;
	t2->right=t4;

	TNode*t5=new TNode();
	t5->data=6;
	t5->left=t5->right=NULL;
	t3->right=t5;

	TNode*t6=new TNode();
	t6->data=7;
	t6->left=t6->right=NULL;
	t3->left=t6;

	TNode*t7=new TNode();
	t7->data=8;
	t7->left=t7->right=NULL;
	t6->left=t7;

	//打印先序遍历的结果;
	OutputF(t);
	cout<<endl;
	cout<<"树的最大距离值: "<<GetMaxDistance(t)<<endl;
}

int main()
{
	Test();
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

编程之美 求二叉树中节点之间最大的距离

标签:

原文地址:http://blog.csdn.net/xy1131975903/article/details/48034465

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!