其他分享
首页 > 其他分享> > 2022-2-18 剑指offer day8

2022-2-18 剑指offer day8

作者:互联网

题1:

JZ54 二叉搜索树的第k个节点

描述

给定一棵结点数为n 二叉搜索树,请找出其中的第 k 小的TreeNode结点值。 1.返回第k小的节点值即可 2.不能查找的情况,如二叉树为空,则返回-1,或者k大于n等等,也返回-1 3.保证n个节点的值不一样     数据范围: 0 \le n \le10000≤n≤1000,0 \le k \le10000≤k≤1000,树上每个结点的值满足0 \le val \le 10000≤val≤1000
进阶:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)
      如输入{5,3,7,2,4,6,8},3时,二叉树{5,3,7,2,4,6,8}如下图所示: 该二叉树所有节点按结点值升序排列后可得[2,3,4,5,6,7,8],所以第3个结点的结点值为4,故返回对应结点值为4的结点即可。
 1 import java.util.*;
 2 
 3 /*
 4  * public class TreeNode {
 5  *   int val = 0;
 6  *   TreeNode left = null;
 7  *   TreeNode right = null;
 8  *   public TreeNode(int val) {
 9  *     this.val = val;
10  *   }
11  * }
12  */
13 
14 public class Solution {
15     /**
16      * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
17      *
18      * 
19      * @param proot TreeNode类 
20      * @param k int整型 
21      * @return int整型
22      */
23     int count=0;
24     int result=-1;
25     public int KthNode (TreeNode proot, int k) {
26         if (proot==null||k<0) return result;
27         // write code here
28         KthNode(proot.left,k);
29         count++;
30         if (count==k) return result=proot.val;
31         KthNode(proot.right,k);
32         return result;
33     }
34 }

思路:递归,利用全局变量记录 次序以及结果。中序遍历。

 

题2:

JZ7 重建二叉树

 

描述

给定节点数为 n 的二叉树的前序遍历和中序遍历结果,请重建出该二叉树并返回它的头结点。 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示。   提示: 1.vin.length == pre.length 2.pre 和 vin 均无重复元素 3.vin出现的元素均出现在 pre里 4.只需要返回根结点,系统会自动输出整颗树做答案对比 数据范围:n \le 2000n≤2000,节点的值 -10000 \le val \le 10000−10000≤val≤10000 要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)
import java.util.*;
/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public TreeNode reConstructBinaryTree(int [] pre,int [] vin) {
        int n=pre.length;
        return Construct(pre,vin,0,n-1,0,n-1);
    }
    
    public TreeNode Construct(int [] pre,int [] vin, int s1, int e1 , int s2 ,int e2) {
        if (s1>e1||s2>e2) return null;
        TreeNode root=new TreeNode(pre[s1]);
        int index=s2;
        while (vin[index]!=pre[s1]) {
            index++;
        }
        System.out.print(index);
        root.left=Construct(pre,vin,s1+1,s1+index-s2,s2,index-1);
        root.right=Construct(pre,vin,s1+index+1-s2,e1,index+1,e2);
        return root;
    }
}

思路:递归实现左右子树,添加数组的索引区间来生成树。

标签:pre,结点,TreeNode,val,day8,int,18,vin,2022
来源: https://www.cnblogs.com/benbicao/p/15908128.html