二叉树节点间的最大距离
一、题目
二叉树上的两个节点,求这两个节点之间的最大距离
二、思路
两个节点之间的距离不一定要经过一颗二叉树的根节点。我们以递归的思路来思考。既然是求二叉树的任意两个节点。那我们以二叉树的一个节点为例,这个节点组成的树;我们可以分成三种情况:
拿到的这三个值取最大值就是以这个节点为树。这棵树上两节点之间的最大距离。
还没有完,以这个节点为树,我们知道了这个树上的两节点的最大距离还不行。这个节点也可能是其他树的子节点。我们不仅要保存这颗树上两节点之间的最大距离;还要保存这棵树上某节点到当前根节点的最大距离,这个将作为其他节点(当前节点为子节点)的一个参考数据。
然后我们分别以二叉树上的所有节点作为树,取出每颗树的最大距离,即为整棵树的两节点间的最大距离。
三、code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| #include <algorithm> #include <iostream>
struct TreeNode { int val; TreeNode* left; TreeNode* right;
explicit TreeNode(int val) : val(val), left(nullptr), right(nullptr) {} };
class Solution { public: int get_max_distance(TreeNode* root) { int node_distance = 0; return get_max_distance_internal(root, &node_distance); }
private: int get_max_distance_internal(TreeNode* root, int* node_distance) { if (root == nullptr) { *node_distance = 0; return 0; } int left_max = get_max_distance_internal(root->left, node_distance); int left_node_distance = *node_distance; int right_max = get_max_distance_internal(root->right, node_distance); int right_node_distance = *node_distance; *node_distance = std::max(left_node_distance, right_node_distance) + 1; int node_max_distance = left_node_distance + right_node_distance + 1; return std::max(std::max(left_max, right_max), node_max_distance); } };
TreeNode* get_binary_tree() { TreeNode* root = new TreeNode(1); root->left = new TreeNode(2); root->right = new TreeNode(3); root->left->left = new TreeNode(4); root->right->right = new TreeNode(5); return root; }
int main() { TreeNode* root = get_binary_tree(); Solution s; int res = s.get_max_distance(root); std::cout << "max distance: " << res << std::endl; return 0; }
|