求二叉树是否包含某个子序列,如上述二叉树包含{2,2,1,5,5},{2,4,4}等
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
/**
* Created by txs on 2018/9/10.
*/
public class TreeHasSubSequence {
public static void main(String[] args) {
int[] array = {2,2,1,5,5};
TreeNode tree=new TreeNode(2);
TreeNode node1=new TreeNode(2);
TreeNode node2=new TreeNode(4);
TreeNode node3=new TreeNode(2);
TreeNode node4=new TreeNode(4);
TreeNode node5=new TreeNode(3);
TreeNode node6=new TreeNode(1);
TreeNode node7=new TreeNode(5);
TreeNode node8=new TreeNode(5);
TreeNode node9=new TreeNode(4);
TreeNode node10=new TreeNode(2);
tree.left=node1;
tree.right=node2;
node1.left=node3;
node2.right=node4;
node3.left=node5;
node5.left=node9;
node5.right=node10;
node3.right=node6;
node6.left=node7;
node7.left=node8;;
System.out.println(isHasSeq(tree,array));
}
/***
* 每个节点都有可能成为起始节点,所以先进行层次遍历初始节点
* @param root
* @param array
* @return
*/
static boolean isHasSeq(TreeNode root, int[] array){
boolean res = false;
Queue<TreeNode> queue = new LinkedList<>();
TreeNode node = root;
queue.offer(node);
while (!queue.isEmpty()){
TreeNode current = queue.poll();
res = hasSub(current,array);
if(res == true){//如果找到就不再继续遍历
break;
}
if(current.left!=null)
queue.offer(current.left);
if(current.right!=null)
queue.offer(current.right);
}
return res;
}
/***
* 是否有子序列,先比较数组第一个和根节点的关系,如果根节点和序列第一个相同的话就判断他的左右子树里面有没有和剩余子序列相同的
* @param node
* @param array
* @return
*/
static boolean hasSub(TreeNode node, int[] array){
int[] temp = array;
if(node == null && array.length == 0){
return true;
}
if(node == null && array.length != 0){
return false;
}
if(array.length == 0){
return true;
}
if(array.length != 1){
if(array[0] == node.val){
return hasSub(node.left, Arrays.copyOfRange(temp,1,temp.length))||hasSub(node.right, Arrays.copyOfRange(temp,1,temp.length));
}else {
return false;
}
}else{
return array[0] == node.val;
}
}
}