輸入兩棵二叉樹A,B,判斷B是不是A的子結構。(ps:我們約定空樹不是任意一個樹的子結構)

背景:昨晚基本思路想了出來,代碼也基本寫出來了。調試出了bug,然後比較深夜了,就去睡覺覺了。今天中午調試了一下,還是有點問題,只通過了百分之33.3的樣本測試,下午看完書後,就繼續調試。終於王天不負有心人,通過了全部的樣本測試。加油!

思路如下:1)先判斷root1的根節點和root2的根節點是否相等,如果相等就調用sameFunction函數對相等節點進行進一步的處理,sameFunction用的基本思想也是遞歸:從相等節點開始一直比較下去,先比較樹的左邊,在比較樹的右邊

2)如果開始時root1的根節點和root2的根節點不相等,那麼就需要從root1的樹中找到一個節點和root2根節點相等的節點,找到後就重複不知1),因此這裏用的也是遞歸。

具體代碼如下:

public class Test01 {

	public static void main(String[] args) {
		//測試樣例
		TreeNode treeNode4=new TreeNode(4);
		TreeNode treeNode7=new TreeNode(7);
		TreeNode treeNode2=new TreeNode(2);
		TreeNode treeNode9=new TreeNode(9);
		TreeNode treeNode8=new TreeNode(8);
		TreeNode treeNode_8=new TreeNode(8);
		TreeNode treeNode_7=new TreeNode(7);
		
		TreeNode SubtreeNode8=new TreeNode(8);
		TreeNode SubtreeNode9=new TreeNode(9);
		TreeNode SubtreeNode2=new TreeNode(2);
		
		treeNode2.left=treeNode4;
		treeNode2.right=treeNode7;
		treeNode8.left=treeNode9;
		treeNode8.right=treeNode2;
		treeNode_8.left=treeNode8;
		treeNode_8.right=treeNode_7;
		
		SubtreeNode8.left=SubtreeNode9;
		SubtreeNode8.right=SubtreeNode2;
		
		Solution solution=new Solution();
		boolean flag=solution.HasSubtree(treeNode_8,SubtreeNode8);
		System.out.println(flag);
	}

}

class Solution {
    public boolean HasSubtree(TreeNode root1,TreeNode root2) {
    	boolean flag=false;
    	//空樹的處理
    	if(root1==null||root2==null) {
    		return flag;
    	}
    	//先判斷節點是否一樣
    	//相等
    	if(root1.val==root2.val) {
    		flag=sameFuction(root1,root2);
    		if(flag==true) {
    			return flag;
    		}
    	}
    	
    	//不相等 ,就繼續遍歷root1,直到找到一個節點和root1的根節點相等爲止
    	if(flag==false) {
    		if(root1.left!=null) {
    			flag=HasSubtree(root1.left, root2);
    			if(flag==true) {
        			return flag;//返回true,證明樹的左邊是一樣的
        		}
        	}
        	if(root1.right!=null&flag==false) {
        		flag=HasSubtree(root1.right, root2);
        		if(flag==true) {
        			return flag;//返回true,證明樹的右邊是一樣的
        		}
        	}
    	}
    	
    	return flag;
    }
    
    //這是找到了兩個相等節點後的處理,即是此時root1和root2的根節點是一樣的
    public boolean sameFuction(TreeNode root1,TreeNode root2) {
    	//此時root1.val==root2.val;
    	//flag只要爲false就可以return;
    	boolean flag=true;
    	if(root1.left!=null&root2.left!=null) {
    		if(root1.left.val==root2.left.val) {
    			flag=sameFuction(root1.left, root2.left);
    			if(flag==false) {
    				return flag;
    			}
    		}else {
    			flag=false;
    			return flag;
    		}
    	}else if (root2.left==null) {
			flag=true;
		}else {
			flag=false;
			return flag;
		}
		
		if (root1.right!=null&root2.right!=null) {
			if(root1.right.val==root2.right.val) {
				flag=sameFuction(root1.right, root2.right);
				if(flag==false) {
					return flag;
				}
			}else {
    			flag=false;
    			return flag;
    		}
		}else if (root2.right==null) {
			flag=true;
		}else {
			flag=false;
			return flag;
		}
		
		return flag;
    }
}

class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章