子二叉树问题
问题来源:http://www.nowcoder.com/questionTerminal/6d3411aa1dfe4c449ebbf8879e97fadd?pos=3&orderByHotValue=1&done=0
两颗二叉树T1和T2,T1的节点数是百万数量级,T2的节点数一千以内,请给出判断T2是否是T1子树的可行算法。
想了想除了遍历好像没什么好方法了,但是百万数量级的二叉树遍历起来肯定很酸爽,注定不能用递归,但是我觉得,非递归用栈应该也很够呛。
还没想到比较好的方法,写了个非递归遍历比较的,思想就是,遍历T1, 如果一节点的value和T2的root的value相同,那么就一同遍历T2;
如果T2遍历完了,说明T2是T1的子树,如果遍历T2到一半发现它俩一个节点的值不同,则将存T2的栈清空,继续遍历T1。
我觉得是不是得考虑KMP算法解决的那个问题,继续遍历T2是不是有点不妥。
public boolean isSameTree(TreeNode bt1, TreeNode bt2){ Stack<TreeNode> BT1 = new Stack(); Stack<TreeNode> BT2 = new Stack(); TreeNode tmp1,tmp2; if((bt1 == null && bt2 != null)|| (bt1 != null && bt2 == null)){ return false; } if(bt1 == null && bt2 != null){ return true; } BT1.push(bt1); BT2.push(bt2); while(!(BT1.isEmpty() || BT2.isEmpty())){ tmp1 = BT1.peek(); tmp2 = BT2.peek(); BT1.pop(); if(tmp1.val == tmp2.val){ if(tmp1.right != null){ BT1.push(tmp1.right); } if(tmp1.left != null){ BT1.push(tmp1.left); } BT2.pop(); if(tmp2.right != null){ BT2.push(tmp1.right); } if(tmp2.left != null){ BT2.push(tmp1.left); } } else{ if(tmp1.right != null){ BT1.push(tmp1.right); } if(tmp1.left != null){ BT1.push(tmp1.left); } if(!BT2.isEmpty()){ BT2.clear(); BT2.push(bt2); } } } if(BT2.isEmpty()){ return true; } return false; }