11.求二叉树中节点的最大距离

如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,
我们姑且定义"距离"为两节点之间边的个数。
写一个程序,
求一棵二叉树中相距最远的两个节点之间的距离。

 

这里可以求节点的左右子树的高度,然后可以得到一该几点为根的最长路径。遍历书的每一个节点,并在遍历过程中用n记录最大值!

 

#include <iostream>
using namespace std;

struct BSTreeNode
{
	int m_nHeight;			//存储数高度
	int m_nValue;			// value of node
	BSTreeNode *m_pLeft;	// left child of node
	BSTreeNode *m_pRight;	// right child of node

	BSTreeNode();
	BSTreeNode(int value);
};

void insert(BSTreeNode** root,int n);		//出入元素
int  getheight(BSTreeNode* root,int &n);	//获得数的高度

int main()
{
	int n = 0 ;

	BSTreeNode* root = NULL;
	insert(&root,10);
	insert(&root,6);
	insert(&root,15);
	insert(&root,4);
	insert(&root,9);
	insert(&root,5);
	insert(&root,7);
	insert(&root,8);
	insert(&root,14);
	insert(&root,13);
	insert(&root,12);

	getheight(root,n);
	cout<<n;

	system("pause");
	return 0;
}

int  getheight(BSTreeNode* root,int &n)
{
	int left;
	int right;
	if (root->m_pLeft == NULL)
		left = 0 ;
	else
		left = getheight(root->m_pLeft,n);
	if (root->m_pRight == NULL)
		right = 0 ;
	else
		right = getheight(root->m_pRight,n);
	if (left+right > n)
		n = left + right ;
	if (left>right)
		return left+1;
	else return right+1;
}

void insert(BSTreeNode** root,int n)
{
	BSTreeNode* temp = new BSTreeNode;
	BSTreeNode* current ;
	temp->m_nValue = n ;
	temp->m_pLeft = NULL ;
	temp->m_pRight = NULL ;
	if (*root == NULL)
	{
		*root = new BSTreeNode(n);
	}
	else
	{
		current = *root ;
		while(current != NULL)
		{
			if (current->m_nValue>n&¤t->m_pLeft==NULL)
			{
				current->m_pLeft = temp ;
				break;
			}
			else if (current->m_nValue>n&¤t->m_pLeft!=NULL)
			{
				current = current->m_pLeft;
				continue;
			}
			else if (current->m_nValue<n&¤t->m_pRight==NULL)
			{
				current->m_pRight = temp;
				break;
			}
			else if (current->m_nValue<n&¤t->m_pRight!=NULL)
			{
				current = current->m_pRight;
				continue;
			}
		}
	}
}

BSTreeNode::BSTreeNode(int value)
{
	m_nValue = value ;
	m_pLeft = NULL ;
	m_pRight = NULL ;
}

BSTreeNode::BSTreeNode()
{}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值