zoukankan      html  css  js  c++  java
  • 剑指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;
        }
    }

  • 相关阅读:
    第五周读书笔记
    第五周课后作业(浅谈腾讯的创新)
    对象数组按属性排序
    id,pid数组转拓扑树结构
    ES6数组reduce()方法详解及高级技巧
    vue实现打印功能
    Js es6中扩展运算符(...)
    Axios 各种请求方式传递参数格式
    vue项目全局使用axios
    安装vue-cli脚手架
  • 原文地址:https://www.cnblogs.com/cjr001/p/7467306.html
Copyright © 2011-2022 走看看