剑指offer-js 树的子结构

树的子结构

题目描述:

输入两棵二叉树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;
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章