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

二叉搜索树的第k个结点

题目描述

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

思路

  1. 对于二叉搜索树,中序遍历的结果是按照顺序来的,我们设置一个变量用来计数,递归的遍历树,如果到了第k个,则把那个数取出来,我在这用的是ArrayList来存储那个结点
  2. 还可以在递归方法中直接返回结点,无需用ArrayList跟踪存储,更加简化

代码

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>();
        myNode(pRoot, k, list);
        if (list.size() == 0) {
        	return null;
        } else {
        	return list.get(0);
        }
    }
	int index = 0;
	public void myNode(TreeNode node, int k, ArrayList<TreeNode> list) {
		if (node == null) {
			return;
		}
		myNode(node.left, k, list);
		index++;
		if (index == k) {
			list.add(node);
			return;
		}
		myNode(node.right, k, list);

	}
// 递归的方法返回结点
public TreeNode myNode01(TreeNode node, int k) {
	TreeNode target = null;
	if (node.left != null) {
		target = myNode01(node.left, k);
	}
	if (target == null) {
		index++;
		if (index == k) {
			return node;
		}
	}
	if (target == null && node.right != null) {
		target = myNode01(node.right, k);
	}
	return target;

}
}
时间: 2024-10-06 01:04:03

二叉搜索树的第k个结点-剑指Offer的相关文章

二叉搜索树的后序遍历序列-剑指Offer

二叉搜索树的后序遍历序列 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 思路 后序遍历:左-->右-->根节点 二叉搜索树中,左子树的节点小于根节点,右子树的节点大于根节点 递归调用,根据大小区别左右子树,若在右子树中发现小于根节点的节点,就不是后续遍历序列 举一反三:如果要求处理一棵二叉树的遍历序列,我们可以先找到二叉树的根节点,再基于根节点把整棵树的遍历序列拆分成左子树对应的子序列和右子

20,判断是不是二叉搜索树的后序遍历《剑指offer》

题目: 给定一个序列,判断是不是二叉搜索树的后序遍历 思路: 递归版: 一个正确的后序遍历可以分为三段来看: 1:最后一个值是根节点   2:左子树节点(都比根节点值小) 3:右子树节点(都比根节点大) 且满足左子树个数加右子树个数等于N-1:(N为后序遍历的节点总个数) 左子树和右子树又可以进行同样的操作,,,perfect的递归定义哈 然后判断出口: 1,正确的出口,子树只有一个元素或者零个元素(这零就是为什么要多写一个函数的原因了..) 2,错误的出口,左子树加上右子树的个数不等于N-1

剑指Offer对答如流系列 - 二叉搜索树的第k个结点

面试题54:二叉搜索树的第k个结点 题目描述 给定一棵二叉搜索树,请找出其中的第k小的结点. 例如,图中的二叉搜索树,按节点值大小顺序,第三大节点的值是4. 二叉搜索树的节点定义 public class Node { int val = 0; Node left = null; Node right = null; public Node(int val) { this.val = val; } } 问题分析 二叉搜索树中序遍历的结果是顺序的.我们可以设置一个全局变量index,对二叉搜索树进

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

题目链接:二叉搜索树的第k个结点 题意:给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8)    中,按结点数值大小顺序第三小结点的值为4. 题解:之前有讲过BST的性质,中序遍历就可以得到一个递增的序列.也就是第k小就用这个性质. 遍历左子树,如果在左子树中找到节点,返回.没有就继续根,右子树... 代码: 1 /* 2 struct TreeNode { 3 int val; 4 struct TreeNode *left; 5 struct TreeNod

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

剑指offer 62.二叉搜索树的第k个结点 题目 给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4. 思路 二叉搜索树的中序遍历是递增的,找到第k小的话,那就只需要中序遍历即可,遍历的第k个数就是所需的数. 代码 public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int v

剑指offer(六十二)之二叉搜索树的第k个结点

题目描述 给定一颗二叉搜索树,请找出其中的第k大的结点.例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4. 代码: <span style="color:#cc33cc;">/* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val;

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

题目描述 给定一颗二叉搜索树,请找出其中的第k大的结点.例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4. 1 /* 2 struct TreeNode { 3 int val; 4 struct TreeNode *left; 5 struct TreeNode *right; 6 TreeNode(int x) : 7 val(x), left(NULL), right(NULL) { 8 } 9 }; 10 */ 11 class Solut

二叉搜索树的第k个结点

题目描述 给定一颗二叉搜索树,请找出其中的第k大的结点.例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4. /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; */ class Solution { public: TreeNode*

《剑指offer》:[63]二叉搜索树的第K个结点

题目:给定一棵二叉搜索树,请找出其中的第K大的结点. 例如在下图中的二叉树,第四个结点就是:5. 分析:这个题目比较简单,得到二叉树的第K个值,因为我们知道中序遍历一棵二叉排序树得到的就是有序的序列.所以我们采用中序遍历和一个计数器count就可以实现了! 具体实现代码如下: #include <iostream> using namespace std; struct BinaryTree { int data; BinaryTree *pLeft; BinaryTree *pRight;