题目:给定一棵二叉树,结点的距离就是两个结点之间路径包含的结点的数目,求结点的最大距离。
可以参考这两篇文章:《编程之美: 求二叉树中节点的最大距离》的另一个解法 和 Tree Diameter
思路:
在每一个结点处,求两个信息:以该结点为根的树的高度,以及以该结点为根的树中包含的最大距离。
因为所求的最大距离,如果是跨越根结点的,则为两个子树的树高度之和+1,如果是不跨越根结点的,则为左右子树中的最大距离的最大值。
代码:
①参考第一篇文章,每次返回两个值:
1 struct TreeNode 2 { 3 int val; 4 TreeNode *left, *right; 5 }; 6 7 //每次返回两个值 8 struct RetVal 9 { 10 int height; 11 int max_dist; 12 RetVal(int h, int d): height(h), max_dist(d) 13 { 14 } 15 }; 16 17 RetVal maxDistInTree(TreeNode *root) 18 { 19 if(root == NULL) 20 return RetVal(0, 0); 21 22 RetVal lcr = maxDistInTree(root->left); //left child result 23 RetVal rcr = maxDistInTree(root->right); 24 25 RetVal result; 26 result.height = 1 + max(lcr.height, rcr.height); 27 result.max_dist = max( max(lcr.max_dist, rcr.max_dist), lcr.height + rcr.height + 1 ); 28 29 return result; 30 }
②参考第二篇文章,分别求高度和树直径
1 //单独求高度和直径(最大距离) 2 int treeHeight(TreeNode *root) 3 { 4 if(root == NULL) 5 { 6 return 0; 7 } 8 else 9 { 10 return 1 + max( treeHeight(root->left), treeHeight(root->right) ); 11 } 12 } 13 14 int treeDiam(TreeNode *root) 15 { 16 if(root == NULL) 17 return 0; 18 19 int l_height = treeHeight(root->left); 20 int r_height = treeHeight(root->right); 21 22 int l_diam = treeDiam(root->left); 23 int r_diam = treeDiam(root->right); 24 25 return max( max(l_diam, r_diam), 26 l_height + r_height + 1); 27 }
时间: 2024-10-10 04:59:33