欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

Subtree(java),

来源: javaer 分享于  点击 34417 次 点评:203

Subtree(java),


Subtree


You have two every large binary trees: T1, with millions of nodes, and T2, with hundreds of nodes. Create an algorithm to decide if T2 is a subtree of T1.

Have you met this question in a real interview?  Yes Example

T2 is a subtree of T1 in the following case:

       1                3
      / \              / 
T1 = 2   3      T2 =  4
        /
       4

T2 isn't a subtree of T1 in the following case:

       1               3
      / \               \
T1 = 2   3       T2 =    4
        /
       4
package campus.lintCode;

public class SubTree {
	public static void main(String[] args) {
		TreeNode treeNode1 = new TreeNode(1);
		TreeNode treeNode21 = new TreeNode(1);
		TreeNode treeNode22 = new TreeNode(1);
		TreeNode treeNode31 = new TreeNode(2);
		TreeNode treeNode32 = new TreeNode(3);
		TreeNode treeNode34 = new TreeNode(2);
		TreeNode treeNode43 = new TreeNode(4);
		TreeNode treeNode44 = new TreeNode(5);
		TreeNode treeNode45 = new TreeNode(3);
		treeNode1.left = treeNode21;
		treeNode1.right = treeNode22;
		treeNode21.left = treeNode31;
		treeNode21.right = treeNode32;
		treeNode22.right = treeNode34;
		treeNode32.left = treeNode43;
		treeNode32.right = treeNode44;
		treeNode34.left = treeNode45;

		TreeNode treeNode212 = new TreeNode(1);
		TreeNode treeNode312 = new TreeNode(2);
		TreeNode treeNode322 = new TreeNode(3);
		TreeNode treeNode432 = new TreeNode(4);
		TreeNode treeNode442 = new TreeNode(5);

		treeNode212.left = treeNode312;
		treeNode212.right = treeNode322;
		treeNode322.left = treeNode432;
		treeNode322.right = treeNode442;

		SubTree subTree = new SubTree();
		System.out.println(subTree.isSubtree(treeNode1, treeNode212));
		//System.out.println(subTree.priorSubtree(treeNode1,treeNode212));

	}


    /**
     * @param T1, T2: The roots of binary tree.
     * @return: True if T2 is a subtree of T1, or false.
     */
    public boolean isSubtree(TreeNode T1, TreeNode T2) {
        // write your code here
         boolean result  = false;
		// 如何child=NULL,则说明child已经到达叶子了,无论parent是否到达一个叶子节点,都应该返回真
		if (T2 == null) {
			return true;
		}
		// 首先,如果程序执行到这里,则child一定不是NULL,如果parent=NULL,则说明parent不包含child
		if (T1 == null) {
			return false;
		}

		if (T1.val == T2.val) {// 当if条件满足的时候,则继续递归判断它们的左子树和右子树是否相等,只有两者相等才返回真
		 result = isSubtreeDef(T1,T2);
		} 
		if(!result)
		{
			result= (isSubtree(T1.left, T2) || isSubtree(T1.right, T2));
		}
		return result;

	}

	public boolean isSubtreeDef(TreeNode T1, TreeNode T2) {
		// write your code here
		// 如何child=NULL,则说明child已经到达叶子了,无论parent是否到达一个叶子节点,都应该返回真
		if (T2 == null&&T1 == null) {
			return true;
		}
		if (T1!=null&&T2!=null&&T1.val == T2.val) {// 当if条件满足的时候,则继续递归判断它们的左子树和右子树是否相等,只有两者相等才返回真
			return (isSubtreeDef(T1.left, T2.left) && isSubtreeDef(T1.right, T2.right));
		} 
		return false;

	}

}

class TreeNode {
	public int val;
	public TreeNode left, right;

	public TreeNode(int val) {
		this.val = val;
		this.left = this.right = null;
	}
}

相关文章

    暂无相关文章
相关栏目:

用户点评