二叉树中节点的最大距离(java)

定义二叉树中节点的距离为节点之间边的个数。<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中,这样就记录了每个节点左右分支的最大深度,同时使用全局变量记录最大的深度,与计算中的中间结果进行计算。得出最大的路径长度。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值