剑指offer-js编写-树

(1)

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

思路:首先找到A中结点的值与B相等的结点,然后从这两个相同的结点出发,判断是否存在重合,若是返回true。否则,在树A的左右子树中寻找与B结点值相同的结点,以这些结点出发递归判断是否是A的子树。

/* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
} */
function HasSubtree(pRoot1, pRoot2)
{
   if(pRoot2 == null || pRoot1 == null ) {
        return false;
    }
    var flag = false;
    if(pRoot1.val == pRoot2.val) {
        flag =  subTree(pRoot1.left ,pRoot2.left) && subTree(pRoot1.right, pRoot2.right);
     }
    if(!flag) {
        flag = HasSubtree(pRoot1.left, pRoot2) || HasSubtree(pRoot1.right, pRoot2);
    }
    return flag;  
}
function subTree(pRoot1,pRoot2){   //判断以root1和root2开头的子数是否重合
    if(pRoot2 == null) {
        return true;
    }
    
    if(pRoot1 == null && pRoot2!=null) {
        return false;
    }
    if(pRoot1.val == pRoot2.val){
        return subTree(pRoot1.left ,pRoot2.left) && subTree(pRoot1.right, pRoot2.right);
    }
    return false;
}

(2)操作给定的二叉树,将其变换为源二叉树的镜像。

二叉树的镜像定义:源二叉树 
    	    8
    	   /  \
    	  6   10
    	 / \  / \
    	5  7 9 11
    	镜像二叉树
    	    8
    	   /  \
    	  10   6
    	 / \  / \
    	11 9 7  5
思路:二叉树的镜像树,通过上图可以看出,从根结点出发(先序遍历思想),先交换根结点的孩子,再依次递归交换左子树、右子数。
/* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
} */
function Mirror(root)
{
   if(root==null){
        return;
    }
    var temp=root.right;
    root.right=root.left;
    root.left=temp;
    Mirror(root.left);
    Mirror(root.right);
    return root;

}
(3)从上往下打印出二叉树的每个节点,同层节点从左至右打印。
思路:二叉树的层次遍历,借用两个数组即可。
/* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
} */
function PrintFromTopToBottom(root)
{
    var dequeTree=[]; //存放树中的结点
    var result=[]; //保存结果
    if(root==null){
        return [];
    }
    dequeTree.push(root);
    while(dequeTree.length){ //当dequeTree.length为0时,表明访问完书中的结点
        pNode=dequeTree.shift();
        result.push(pNode.val);
        if(pNode.left)
            dequeTree.push(pNode.left);
        if(pNode.right)
            dequeTree.push(pNode.right);
    }
    return result;
    
}
(4)输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
解析:对于一棵二叉排序树,存在特点:根结点的左子树都小于根结点,根结点的右子数都大于根结点。后序遍历最后访问的是根结点,因此,对于一个整数
数组,最后一个元素肯定是根结点,并且如果前部分(左子树)都小于最后一个元素(根结点),后部分(右子树)都大于最后一个元素(根结点)。递归判
断前部分和后部分是否是二叉排序树。
function VerifySquenceOfBST(sequence)
{
    if(sequence.length==0){
        return false;
    }
    return jurge(sequence,0,sequence.length-1);
    function jurge(sequence,first,last){
        if(first==last)
            return true;
        var max=sequence[last];
        var temp1=first;
        while(sequence[temp1]<max&&temp1<last){
            temp1++;
        }
        temp1=temp1-1;
        var temp2=temp1+1;
        while(sequence[temp2]>max&&temp2<last){
            temp2++;
        }
        if(temp2==last)
            return true;
        if(temp2!=last)
            return false;   
        var a1=jurge(sequence,first,temp1);
        var a2=jurge(sequence,temp1+1,last-1);
        return a1&&a2;
    }
}

posted @ 2017-09-02 18:11  入门级小菜  阅读(307)  评论(0编辑  收藏  举报