每日一道面试题 - 03_百度

每日一题:从阿里,腾讯,百度,美团,头条等大厂技术题目中选取有价值得题目,对题目考察目标进行分析,并给出参考答案。每日一题,在不知不觉中进步,欢迎留言区打卡 !

问题:给定一个二叉搜索树(BST),找到树中第 K 小的节点。

出题人:阿里巴巴出题专家:文景/阿里云 CDN 资深技术专家。

考察点:

 1. 基础数据结构的理解和编码能力

 2.  递归使用

参考答案:

       5	
      / \	
     3   6	
    / \	
   2   4	
  /	
 1

说明:保证输入的 K 满足 1<=K<=(节点数目)

树相关的题目,第一眼就想到递归求解,左右子树分别遍历。联想到二叉搜索树的性质,root 大于左子树,小于右子树,如果左子树的节点数目等于 K-1,那么 root 就是结果,否则如果左子树节点数目小于 K-1,那么结果必然在右子树,否则就在左子树。因此在搜索的时候同时返回节点数目,跟 K 做对比,就能得出结果了。

/**	
 * Definition for a binary tree node.	
 **/	

	
public class TreeNode {	
    int val;	
    TreeNode left;	
    TreeNode right;	
    TreeNode(int x) { val = x; }	
}	

	
class Solution {	
    private class ResultType {	
    	
        boolean found;  // 是否找到	
        	
        int val;  // 节点数目	
        ResultType(boolean found, int val) {	
            this.found = found;	
            this.val = val;	
        }	
    }	

	
    public int kthSmallest(TreeNode root, int k) {	
        return kthSmallestHelper(root, k).val;	
    }	

	
    private ResultType kthSmallestHelper(TreeNode root, int k) {	
        if (root == null) {	
            return new ResultType(false, 0);	
        }	

	
        ResultType left = kthSmallestHelper(root.left, k);	

	
        // 左子树找到,直接返回	
        if (left.found) {	
            return new ResultType(true, left.val);	
        }	

	
        // 左子树的节点数目 = K-1,结果为 root 的值	
        if (k - left.val == 1) {	
            return new ResultType(true, root.val);	
        }	

	
        // 右子树寻找	
        ResultType right = kthSmallestHelper(root.right, k - left.val - 1);	
        if (right.found) {	
            return new ResultType(true, right.val);	
        }	

	
        // 没找到,返回节点总数	
        return new ResultType(false, left.val + 1 + right.val);	
    }	
}

历史题

 

 

 

今日一题选自热门GitHub项目interview_internal_reference。

 

每日一道面试题 - 03_百度_02