从二叉树的节点A出发,可以向上或者向下走,但沿途的节点只能经过一次,当到达节点B时,路径上的节点数叫作A到B的距离。对于给定的一棵二叉树,求整棵树上节点间的最大距离。
最大距离不外乎两种情况
1、左子树或者右子树特别庞大,最大距离出现在左子树或右子树两个节点之间;
2、左右两子树节点数量大致平衡,则最大距离横跨左右子树,这种情况下必然是离头结点的左右两个子节点最远的节点之间的距离
遍历时不断返回两个参数,第一个是左右子树中节点的最大距离,第二个是左右子树中某个孩子节点距离当前头结点的最大距离,并根据这种返回值来最终确定最大距离
class LongestDistance {
public:
int findLongest(TreeNode* root) {
// write code here
vector<int> temp;
temp=backtree(root);
return temp[0];
}
vector<int> backtree(TreeNode* root){
vector<int> res(2,0); //存储两个返回值的数组
if(root==NULL) return res;
int temp;
vector<int> ltemp,rtemp; //存储上一层的返回值
ltemp=backtree(root->left); //后序遍历
rtemp=backtree(root->right);
res[1]=max(ltemp[1],rtemp[1])+1; //res[1]是存储以当前节点为头结点,距离左右子树最左或最右孩子节点的最大距离
temp=max(ltemp[0],rtemp[0]); //上一层的左右子树的res[0]即为以上一层节点为头结点的距离最大值
res[0]=max(temp,ltemp[1]+rtemp[1]+1);//对以当前节点为头结点的二叉树节点比较,是左子树或者右子树上的节点距离最大值更大,还是左右最远节点的距离更大,取两者较大值作为以当前节点为头结点的二叉树中节点之间的最大距离。这里说明一点,temp数值是完全继承上一层的递归,是因为本层的左子树或者右子树的最大值本身就是上一层直接返回的最大值res[0],并不因为多了一层而有改变,但是左右最远节点的值因为上了一层需要多+1
return res;
}
};