zoukankan      html  css  js  c++  java
  • 剑指offer-js编写-树(2)

    参考牛客网上面的解析

    (1)给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / 3 7 / / 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。

    思路:已知二叉搜索树的中序遍历就是有序序列,因此使用中序遍历思想,访问第K个结点即为所求的第K大的结点。

    /* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
    } */
    function KthNode(pRoot, k)
    {
    var arr=[];
    if(pRoot===null||k<1){
    return null;
    }
    function midInorder(root){
    if(root.left!==null){
    midInorder(root.left);
    }
    arr.push(root);
    if(root.right!==null){
    midInorder(root.right);
    }
    }
    midInorder(pRoot);
    return arr[k-1];
    }

    (2)给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

    思路:首先知道中序遍历的规则是:左根右,然后作图

     

    结合图,我们可发现分成两大类:1、有右子树的,那么下个结点就是右子树最左边的点;(eg:D,B,E,A,C,G) 2、没有右子树的,也可以分成两类,a)是父节点左孩子(eg:N,I,L) ,那么父节点就是下一个节点 ; b)是父节点的右孩子(eg:H,J,K,M)找他的父节点的父节点的父节点...直到当前结点是其父节点的左孩子位置。如果没有eg:M,那么他就是尾节点。

    /*function TreeLinkNode(x){
    this.val = x;
    this.left = null;
    this.right = null;
    this.next = null;
    }*/
    function GetNext(pNode)
    {
    if(pNode==null)
    return null;
    if(pNode.right!=null){
    var l=pNode.right.left;
    var p1=pNode.right;
    while(l!=null){
    p1=l;
    l=l.left;
    }
    return p1;
    }
    while(pNode.next!=null){
    var p=pNode.next;
    if(p.left==pNode){
    return p;
    }else{
    pNode=pNode.next;
    }

    }
    return null;
    }

    (3)请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。(二叉树的镜像在前面有介绍)

    解析: 递归思想,如果一棵树根结点为空则返回true,否则递归判断左子树和右子数是否对称,对称即各从某一相同结点出发,判断一棵树的左结点和另一棵树的右节点是否相同、一棵树的右节点和另一棵树的左节点是否相同。

    /* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
    } */
    function isSymmetrical(pRoot)
    {
    if(pRoot==null)
    return true;
    var left=pRoot.left;
    var right=pRoot.right;
    return isSameTree(left,right);

    }
    function isSameTree(lNode,rNode){
    if(lNode==null&&rNode==null){
    return true;
    }else if(lNode==null||rNode==null){
    return false;
    }else if(lNode.val!=rNode.val){
    return false;
    }else{
    return isSameTree(lNode.left,rNode.right)&&isSameTree(lNode.right,rNode.left);
    }
    }

    (4)输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。

    解析:递归求解:假如是空节点,则返回0;否则,原树的深度由左右子树中深度较的深度加1,为原树的深度。

    /* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
    } */
    function TreeDepth(pRoot)
    {
    if(pRoot==null){
    return 0;
    }
    var left=1+TreeDepth(pRoot.left);
    var right=1+TreeDepth(pRoot.right);
    return Math.max(left, right);
    }

    (5)输入一棵二叉树,判断该二叉树是否是平衡二叉树。
    解析:递归遍历求节点的深度,深度之差超过1的则不是平衡二叉树

    /* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
    } */
    function IsBalanced_Solution(pRoot)
    {
    if(pRoot === null) {
    return true;
    }
    var left = TreeDepth(pRoot.left),
    right = TreeDepth(pRoot.right);
    var dif = left - right;
    if(dif > 1 || dif < -1) {
    return false;
    }
    return IsBalanced_Solution(pRoot.left) && IsBalanced_Solution(pRoot.right);
    }
    function TreeDepth(pRoot) {
    if(!pRoot) {
    return null;
    }
    var left = TreeDepth(pRoot.left),
    right = TreeDepth(pRoot.right);
    return Math.max(left,right) + 1;
    }

  • 相关阅读:
    Thread.currentThread().getName() ,对象实例.getName() 和 this.getName()区别
    CentOS7.7 yum安装新版git
    CentOS使用epel安装不同版本php-fpm
    ubuntu16.04安装mysql5.6
    阿里云Confluence无法发送邮件修复
    windowserver 2012安装openssh
    linux增加history时间戳
    SQL Server 2008R2各个版本,如何查看是否激活,剩余可用日期?
    nginx增加访问验证
    mysql5.6和5.7的权限密码设置
  • 原文地址:https://www.cnblogs.com/cjr001/p/7467479.html
Copyright © 2011-2022 走看看