输入两棵二叉树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;

    }

}

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