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;
    }

  • 相关阅读:
    Understanding about Baire Category Theorem
    Isometric embedding of metric space
    Convergence theorems for measurable functions
    Mindmap for "Principles of boundary element methods"
    Various formulations of Maxwell equations
    Existence and uniqueness theorems for variational problems
    Kernels and image sets for an operator and its dual
    [loj6498]农民
    [luogu3781]切树游戏
    [atAGC051B]Three Coins
  • 原文地址:https://www.cnblogs.com/cjr001/p/7467479.html
Copyright © 2011-2022 走看看