1. 程式人生 > >二叉樹中節點的最大距離(java)

二叉樹中節點的最大距離(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中,這樣就記錄了每個節點左右分支的最大深度,同時使用全域性變數記錄最大的深度,與計算中的中間結果進行計算。得出最大的路徑長度。