您的位置:首页 > Web前端

剑指offer-二叉搜索树的第k个结点

2016-11-07 20:07 281 查看
题目描述

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

分析

通过中序遍历列出节点顺序列表

更加优化的解决办法是直接在遍历的时候将k值带进去O(k)-O(n)

import java.util.ArrayList;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;

public TreeNode(int val) {
this.val = val;

}

}
*/
public class Solution {
TreeNode KthNode(TreeNode pRoot, int k) {
if (pRoot == null) {
return null;
}
ArrayList<TreeNode> list = new ArrayList<TreeNode>();
inOrderTree(pRoot, list);
if (list.size() < k || k == 0) {
return null;
} else {
return list.get(k-1);
}
}

private void inOrderTree(TreeNode pRoot, ArrayList<TreeNode> list) {
if(pRoot == null) {
return;
}
inOrderTree(pRoot.left, list);
list.add(pRoot);
inOrderTree(pRoot.right, list);
}
}


O(k):

int cnt = 0;

TreeNode KthNode(TreeNode pRoot, int k) {
if (pRoot == null)
return null;
TreeNode t = KthNode(pRoot.left, k);
if (t != null)
return t;
if (++cnt < k)
return KthNode(pRoot.right, k);
else if (cnt == k)
return pRoot;
return null;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: