寬度:節點的葉子數
深度:節點的層數
算法上有所謂的"寬度優先算法"和"深度優先算法"
二叉樹的寬度定義為具有最多結點數的層中包含的結點數。
比如上圖中,
第1層有1個節點,
第2層有2個節點,
第3層有4個節點,
第4層有1個節點,
可知,第3層的結點數最多
所以這棵二叉樹的寬度就是4
定義一個節點類
class TreeNode { char val; TreeNode left = null; TreeNode right = null; TreeNode(char _val) { this.val = _val; } }
1求高度
這個可以使用遞歸,分別求出左子樹的深度、右子樹的深度,兩個深度的較大值+1即可。
int getHeight(TreeNode root) { if(root==null) return 0; else{ int left=getHeight(root.left); int right=getHeight(root.right); return 1+Math.max(left,right); } }
2求寬度
使用隊列,層次遍歷二叉樹。在上一層遍歷完成后,下一層的所有節點已經放到隊列中,此時隊列中的元素個數就是下一層的寬度。以此類推,依次遍歷下一層即可求出二叉樹的最大寬度。
public int getWeight(TreeNode root) { if(root==null) return 1; Queue <TreeNode>queue=new ArrayDeque<TreeNode>(); int maxWeight=1;//最大寬度 queue.add(root);//入隊 while(true) { int len=queue.size();//當前層節點數 if(len==0) break; while(len>0)//如果當前層還有節點 { TreeNode t=queue.poll(); len--; if(t.left!=null) queue.add(t.left);//下一層節點入隊 if(t.right!=null) queue.add(t.right); //下一層節點入隊 } maxWeight=Math.max(maxWeight,queue.size()); } return maxWeight; }
求寬度 方法2
//求葉子數 public static int countOfLeaf(TreeNode root) { int result=0; if(root==null) return 0; if(root.left==null || root.right==null) return 1; else result= countOfLeaf(root.left)+countOfLeaf(root.right); return result; }
參考:http://www.cnblogs.com/xudong-bupt/p/4036190.html

