剑指 Offer 26. 树的子结构
题目描述
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
解答
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
/**
二叉树的前序遍历
前序遍历是根、左、右,那么先将根节点入栈,然后等根节点出栈的时候,进行出栈操作:将节点的值放入结果队列中,并将节点的右孩子、左孩子依次入栈。入栈操作进行完之后,再进行出栈操作,然后不断循环,直到栈null为止。
思路:
前序遍历二叉树,如果当前遍历到的节点和B树的根节点值相同,则将当前子树和B树进行比较,返回比较结果
*/
public boolean isSubStructure(TreeNode A, TreeNode B) {
if(A == null || B == null){
return false;
}
Stack<TreeNode> st = new Stack<>();
st.push(A);
while(!st.empty()){
TreeNode node = st.pop();
if(node.val == B.val){
if(isSameTree(node,B)){
return true;
}
}
if(node.right != null){
st.push(node.right);
}
if(node.left != null){
st.push(node.left);
}
}
return false;
}
/**
判断child树是否包含B树,注意此时只是判断是否包含,并不是判断相等。
终止条件:
当节点B为空:说明树B已匹配完成(越过叶子结点),因此返回true
当结点A为空:说明已经越过树A叶子节点,即匹配失败,返回false
当结点A和B的值不同:说明匹配失败,返回false
返回值:
判断A和B的左子节点是否包含,即isContainTree(child.left,B.left)
判断A和B的右子节点是否包含,即isContainTree(child.right,B.right)
*/
public boolean isContainTree(TreeNode child,TreeNode B){
if(B == null){
return true;
}
if(child == null){
return false;
}
if(child.val != B.val){
return false;
}else{
return isContainTree(child.left,B.left) && isContainTree(child.right,B.right);
}
}
}