数据结构2 二叉树的高度和宽度
宽度:节点的叶子数
深度:节点的层数
算法上有所谓的"宽度优先算法"和"深度优先算法"
二叉树的宽度定义为具有最多结点数的层中包含的结点数。
比如上图中,
第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