【Java】 劍指offer(26) 樹的子結構


本文參考自《劍指offer》一書,代碼采用Java語言。

更多:《劍指Offer》Java實現合集  

題目 

  輸入兩棵二叉樹A和B,判斷B是不是A的子結構。

思路

  1)先對A樹進行遍歷,找到與B樹的根結點值相同的結點R;

  2)判斷A樹中以R為根結點的子樹是否包含B樹一樣的結構。

測試算例 

  1.功能測試(A、B為普通二叉樹;B是或者不是A樹的子結構)

  2.特殊測試(任意一個或者兩個樹的根結點為null;左斜樹;右斜樹)

Java代碼

//題目:輸入兩棵二叉樹A和B,判斷B是不是A的子結構。

public class SubstructureInTree {
	public class TreeNode{
		double val;
		TreeNode left = null;
		TreeNode right =null;
		public TreeNode(int val) {
			this.val=val;
		}
	}
	
	/*
	 * 主程序,對每個結點遍歷判斷
	 */
    public boolean hasSubtree(TreeNode root1,TreeNode root2) {
        if(root1==null || root2==null)
        	return false;
//        boolean result=false;
//        if(equal(root1.val, root2.val)) {
//        	result = doesTree1HasTree2(root1, root2);
//        	if(!result)
//        		result=hasSubtree(root1.left, root2)
//        		||hasSubtree(root1.right, root2);
//        }
//        return result;
        //上面幾行可以直接寫成:
        return doesTree1HasTree2(root1, root2)|| hasSubtree(root1.left, root2)
        		||hasSubtree(root1.right, root2);
    }  
    
    /*
     * 判斷root結點開始的子樹中各個結點是否相同
     */
    private boolean doesTree1HasTree2(TreeNode root1,TreeNode root2) {
    	if(root2==null)	return true;  
    	if(root1==null)	return false;
    	return equal(root1.val, root2.val) && doesTree1HasTree2(root1.left, root2.left)
    			&& doesTree1HasTree2(root1.right, root2.right); 	
    }
	
    /*
     * 判斷兩個浮點數是否相等
     */
    private boolean equal(double num1,double num2) {
    	if(num1-num2<0.0000001 && num1-num2>-0.0000001 )
    		return true;
    	return false;
    }   
}

  

收獲

  1.本題相當於對二叉樹遍歷的拓展,操作過程中,注意null的處理。

  2.注意判斷浮點數相等時有誤差,不要直接用“==”判斷。

  

更多:《劍指Offer》Java實現合集  

  


免責聲明!

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



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