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