數據結構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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM