leetcode543

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left;
 *     public TreeNode right;
 *     public TreeNode(int x) { val = x; }
 * }
 */
public class Solution
    {
        Stack<TreeNode> S = new Stack<TreeNode>();//记录访问过的节点

        Dictionary<TreeNode, List<TreeNode>> dic = new Dictionary<TreeNode, List<TreeNode>>();

        private void postTree(TreeNode node)
        {
            if (node != null)
            {
                S.Push(node);
                if (node.left != null)
                {
                    postTree(node.left);
                }
                if (node.right != null)
                {
                    postTree(node.right);
                }

                if (node.left == null && node.right == null)
                {
                    var nodelist = S.ToList();
                    nodelist.Reverse();

                    if (!dic.ContainsKey(node))
                    {
                        dic.Add(node, nodelist);
                    }
                }
                S.Pop();
            }
        }

        public int DiameterOfBinaryTree(TreeNode root)
        {
            postTree(root);

            var maxDiameter = 0;

            foreach (var d in dic)
            {                
                foreach (var d2 in dic)
                {
                    if (d.Key == d2.Key)
                    {
                        var diameter = d2.Value.Count - 1;
                        maxDiameter = Math.Max(maxDiameter, diameter);
                    }
                    else
                    {
                        //第一种情况:计算叶子节点到根节点的直径
                        var depth = d2.Value.Count - 1;                        

                        var c1 = d.Value.Count;
                        var c2 = d2.Value.Count;
                        var diameter = 0;

                        if (c1 < c2)
                        {
                            for (int i = 0; i < c1; i++)
                            {
                                if (d.Value[i] != d2.Value[i])
                                {
                                    diameter = c1 - i + c2 - i;
                                    break;
                                }
                            }
                        }
                        else
                        {
                            for (int i = 0; i < c2; i++)
                            {
                                if (d.Value[i] != d2.Value[i])
                                {
                                    diameter = c1 - i + c2 - i;
                                    break;
                                }
                            }
                        }


                        //var IncCount = d.Value.Intersect<TreeNode>(d2.Value).Count();
                        //var diameter = (c1 - IncCount) + (c2 - IncCount);

                        diameter = Math.Max(diameter, depth);
                        maxDiameter = Math.Max(maxDiameter, diameter);
                    }
                }
            }
            return maxDiameter;
        }
    }

https://leetcode.com/problems/diameter-of-binary-tree/#/description

补充一种递归的方式,使用python实现:

思路是每次递归判断,以当前节点为根节点是否能达到最大,见第7行。

而每次递归向上返回的是当前节点的左右子树的高度的更大的一个,加上当前节点(+1)的高度,见第8行。

 1 class Solution:
 2     maxnum = 0
 3     def getLength(self,root):
 4         if root != None:
 5             left = self.getLength(root.left)
 6             right = self.getLength(root.right)
 7             self.maxnum = max(self.maxnum,left+right)
 8             return 1 + max(left,right)
 9         return 0
10 
11     def diameterOfBinaryTree(self, root: 'TreeNode') -> 'int':
12         self.getLength(root)
13         return self.maxnum

 

转载于:https://www.cnblogs.com/asenyang/p/6732566.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值