分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 前端开发

剑指offer-js编写-树

发布时间:2023-09-06 01:08责任编辑:沈小雨关键词: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;
    }
}

剑指offer-js编写-树

原文地址:http://www.cnblogs.com/cjr001/p/7467306.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved