二叉树经典面试题

1.求二叉树中最远的两个节点的距离,对于这样一个题经过画图分析总体来说有以下几种情况:



分析:

        通过上图我们可发现最远两个节点距离实则为某一节点左右子树的高度和,可以这样考虑,遍历树中每个节点,得出它们的左右子树高度和,从而通过比较更新得到两个节点的最远距离,这个过程是同类的子问题因此可以考虑递归算法。在递归遍历的过程中如果采用前序的话时间复杂度为O(N^2),要想进一步优化我们可以采取后序遍历,其时间复杂度为O(N)。

       我们可以定义一个全局遍历用来保存最远距离,通过传引用的方式来获取最远距离。在进行后序遍历的同时,将每一个节点左右子树的深度带回,从而得出left+right,如果当前节点的左右子树距离(它们的和)大于前一节点的左右子树距离,那么就更新这个distance.

代码实现:

template<class T>
struct BinaryTreeNode
{
	BinaryTreeNode(const T& data)
		:_data(data)
		,_left(NULL)
		,_right(NULL)
	{}

	T _data;
	BinaryTreeNode<T>* _left;
	BinaryTreeNode<T>* _right;
};

template<class T>
class BinaryTree
{
	typedef BinaryTreeNode<T> Node;

public:
	BinaryTree(const T* arr,size_t size,const T& invalid)
	{
		size_t index=0;
		_root=_CreateBinaryTree(arr,size,invalid,index);
	}
	void PreOrder()
	{
		_PreOrder(_root);
		cout<<endl;
	}
	int GetFarthestDistance()
	{
		int distance=0;
		_GetFarthestDistance(_root,distance);
		return distance;
	}
protected:
	void _PreOrder(Node* root)
	{
		if(root==NULL)
			return ;

		cout<<root->_data<<" ";
		_PreOrder(root->_left);
		_PreOrder(root->_right);
	}

	Node* _CreateBinaryTree(const T* arr,size_t size,const T& invalid,size_t& index)
	{
		assert(arr);
		Node* root=NULL;
		if(index<size && arr[index]!=invalid)
		{
			root=new Node(arr[index]);
			root->_left=_CreateBinaryTree(arr,size,invalid,++index);
			root->_right=_CreateBinaryTree(arr,size,invalid,++index);
		}
		return root;
	}

	int _GetFarthestDistance(No
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值