题目
- 给定一棵二叉搜索树,
请找出其中的第k小的结点。
例如, (5,3,7,2,4,6,8)
中,按结点数值大小顺序第三小结点的值为4。
算法
思路:二叉搜索树按照中序遍历的顺序打印出来正好就是排序好的顺序。 所以,按照中序遍历顺序找到第k个结点就是结果。
代码
package ATree;
import sun.reflect.generics.tree.Tree;
import java.util.Stack;
/**
* @Author Zhou jian
* @Date 2020 ${month} 2020/3/14 0014 15:43
* 给定一棵二叉搜索树,
* 请找出其中的第k小的结点。
* 例如, (5,3,7,2,4,6,8)
* 中,按结点数值大小顺序第三小结点的值为4。
*
* //思路:二叉搜索树按照中序遍历的顺序打印出来正好就是排序好的顺序。
// 所以,按照中序遍历顺序找到第k个结点就是结果。
*/
public class Problrm7 {
int i =0;
TreeNode res = null;
//按照中序遍历,第i次遍历到的数据就是第i小的数据
TreeNode KthNode(TreeNode pRoot, int k) {
if(pRoot.left!=null){
KthNode(pRoot.left,k);
}
//第i次遍历的数据
i++;
if(i==k){
res=pRoot;
}
if(pRoot.right!=null){
KthNode(pRoot.right,k);
}
return res;
}
//非递归中序遍历
TreeNode KthNode1(TreeNode root, int k) {
Stack<TreeNode>stack = new Stack<>();
int count = 0;
TreeNode node = root;
do{
if(node!=null){
//不断向左添加数据
stack.push(node);
//取左节点
node=node.left;
}else{
node=stack.pop();
count++;
if(count==k)
return node;
node = node.right;
}
}while(node!=null||stack.isEmpty());
return null;
}
public static void main(String[] args) {
TreeNode head = new TreeNode(5);
TreeNode B = new TreeNode(3);
TreeNode C = new TreeNode(2);
TreeNode D = new TreeNode(4);
TreeNode E = new TreeNode(7);
TreeNode F = new TreeNode(6);
TreeNode G = new TreeNode(8);
head.left=B;
B.left=C;
B.right=D;
head.right=E;
E.left=F;
E.right=G;
System.out.println(new Problrm7().KthNode(head,3));
}
}