leetcode-每日打卡543. 二叉树的直径

543.二叉树的直径
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过根结点。
一开始没理解题意,以为是根左右子树的最长路径,然后才发现可以不经过根。
递归地访问左右子树,将左右子树的最大值作为某个点的高度,同时维护一个最大值,每个节点加上左右节点高度看是否超过这个最大值,这个最大值是二叉树的直径,但不是递归函数的返回值,返回值为左右节点较大的高度。

class Solution {    
int max=0;    
int maxlen(TreeNode root)    
{        
if(root==null)        
return 0;        
int left=0,right=0;        
left=maxlen(root.left);        
right=maxlen(root.right);        
max=Math.max(max,left+right);        
return Math.max(left,right)+1;    }    
public int diameterOfBinaryTree(TreeNode root) {                
maxlen(root);        
return max;    }}

由于二叉树高度要是一个存在于多个函数的值,所以在函数体外定义,作为全局变量。

21.合并两个有序链表
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
用的是迭代法,用一个新的节点来连这个合并的链表。
注意:节点的定义,之前好像都挺随便的。
ListNode p=new ListNode();//没有赋初值的情况
ListNode p=new ListNode(-1);//无意义的头节点赋-1

class Solution {    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {        ListNode p=new ListNode(-1);        ListNode head=new ListNode(-1);        p=head;        while(l1!=null&&l2!=null)        {            if(l1.val<=l2.val)            {head.next=l1;            l1=l1.next;}            else            {                head.next=l2;                l2=l2.next;            }            head=head.next;        }        if(l1==null)        head.next=l2;        else if(l2==null)        head.next=l1;        return p.next;    }}
发布了45 篇原创文章 · 获赞 4 · 访问量 1048

猜你喜欢

转载自blog.csdn.net/weixin_43838915/article/details/104785579