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

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

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

題目 

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

思路

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

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

測試算例 url

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

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

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的處理。blog

  2.注意判斷浮點數相等時有偏差,不要直接用「==」判斷。get

  

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

相關文章
相關標籤/搜索