定义二叉树中节点的距离为节点之间边的个数。<p> <wbr> <wbr> 一个二叉树中节点的最大距离由三部分综合求得:一部分是左子树中节点的最大距离,另一部分是右子树中节点的最大距离,最后一部分是左边的最大深度加上右边的最大深度。</wbr></wbr></p>
<pre name="code" class="java"> public static void makeTree(Node head)
{
/* 1
4 2
5 3 6*/
//head.data=1;
Node node4=new Node();
node4.data=4;
node4.parent=head;
head.left=node4;
Node node5=new Node();
node5.data=5;
node5.parent=node4;
node4.right=node5;
Node node2=new Node();
node2.data=2;
head.right=node2;
node2.parent=head;
Node node3=new Node();
node3.data=3;
node3.parent=node2;
node2.left=node3;
Node node6=new Node();
node6.data=6;
node6.parent=node2;
node2.right=node6;
// Node node7=new Node();
// node7.data=7;
// node7.parent=node6;
// node6.right=node7;
}
}
class Node
{
Node left=null;
Node right=null;
Object data=null;
Node parent=null;
boolean visited=false;
int leftLen;//求距离最远的节点
int rightLen;
}
package campus.tree;
public class MaxLenTree {
//这个考虑情况不全面,会有漏掉的部分
// public static void main(String[] args) {
// Node head=new Node();
// head.data=1;
// TreeDeal.makeTree(head);
// while (head.left==null||head.right==null) {
// if(head.left==null)head=head.right;
// if(head.right==null)head=head.left;
// }
// int leftlen=maxLen(head.left);
// int rightlen=maxLen(head.right);
// System.out.println(rightlen+leftlen);
// }
// public static int maxLen(Node head)
// {
// if(head==null) return 0;
// return 1+Math.max(maxLen(head.left), maxLen(head.right));
// }
//树的结构如下:
/* 1
4 2
5 3 6*/
static int maxlen=0;
public static void main(String[] args) {
Node head=new Node();
head.data=1;
TreeDeal.makeTree(head);
System.out.println(maxLenGet(head));
System.out.println(maxlen);
}
public static int maxLenGet(Node head)
{
if(head==null)return 0;
if(head.left!=null)
{
head.leftLen=maxLenGet(head.left)+1;
}
else {
head.leftLen=0;
}
if(head.right!=null)
{
head.rightLen=maxLenGet(head.right)+1;
}
else {
head.rightLen=0;
}
if(head.rightLen+head.leftLen>maxlen)
{
maxlen=head.rightLen+head.leftLen;
}
return head.rightLen>head.leftLen?head.rightLen:head.leftLen;
}
}
兼顾所有的情况,主要思想就是使用动态规划的方式每次求得节点左右子树的最大路径长度,分别记录在leftLen与rightLen中,这样就记录了每个节点左右分支的最大深度,同时使用全局变量记录最大的深度,与计算中的中间结果进行计算。得出最大的路径长度。