树的子结构
题目描述:
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
问题分析:
判断B是不是A的子树,那么就必须有两个操作,
遍历A子树找对应的根结点,
遍历B结点比较A树的子结构是否和B树相同
通过递归完成B树节点的逐个比较,return 结果
代码展示:
/* function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
} */
function HasSubtree(pRoot1, pRoot2)
{
// 1,在树A中找到和树B一样的节点R
// 2,找以节点R为根结点的子树是包含树B
var result = false;
//两个树都不为空的情况下进行比较,否则返回false
if(pRoot1!=null && pRoot2!=null){
//找到对应树B的根结点的点
if(pRoot1.val == pRoot2.val){
//以这个根结点为起点进行判断是否包含树B
result = haveTree(pRoot1,pRoot2);
}
if(!result){
//如果找不到,就以pRoot1的左儿子为起点,进行判断
result = haveTree(pRoot1.left,pRoot2);
}
if(!result){
//如果还找不到,就以pRoot1的右儿子为起点,进行判断
result = haveTree(pRoot1.right,pRoot2);
}
}
return result;
}
//判断是否是子结构
function haveTree(root1,root2){
//如果树B已经遍历结束,且都符合,返回true
if(root2 == null)
return true;
//如果树B没有遍历结束,但是树A遍历结束了,则结构不对,返回false
if(root1 == null)
return false;
//如果有一个结点不同,则不符合条件,返回false
if(root1.val != root2.val)
return false;
//如果根结点符合条件,则比较子节点
return haveTree(root1.left,root2.left) && haveTree(root1.right,root2.right);
}
总结:
如果说链表的操作中遍历居多,那么树中就是更多了些递归,链表有结点,树也有结点,多了两个子节点
next,和left、right 是具有同一效应的符号,这个需要注意一下。
链表结构的定义
function ListNode(x){
this.val = x;
this.next = null;
}
树结构的定义
function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
}