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

    技术2023-09-16  115

    题目描述

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

    解题思路

    二叉搜索树-二叉排序树 特点:左<中<右 二叉搜索树中序遍历为从小到大的一组树 即,中序遍历树,每个结点存在ArrayList中,当k>=1并且list.size()>=k,返回list.get(k-1) 否则,返回null

    二叉树中序遍历-递归法

    /* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ import java.util.*; public class Solution { List<TreeNode> list = new ArrayList<>(); TreeNode KthNode(TreeNode pRoot, int k) { count(pRoot); if(k>=1 && list.size()>k-1){ return list.get(k-1); } return null; } //中序遍历 public void count(TreeNode p){ if(p!=null) { count(p.left); list.add(p); count(p.right); } } }

    二叉树中序遍历-非递归

    /* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ import java.util.*; public class Solution { TreeNode KthNode(TreeNode pRoot, int k) { Stack<TreeNode> stack = new Stack<>();//建立栈 TreeNode p = pRoot; if(pRoot == null || k<1) return null; while(!stack.empty() || p!=null) { if(p!=null){ stack.push(p); p = p.left; } else{ p = stack.pop(); k--; if(k==0){ return p; } p = p.right; } } return null; } /* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ import java.util.*; public class Solution { List<TreeNode> list = new ArrayList<>(); TreeNode KthNode(TreeNode pRoot, int k) { count(pRoot); if(k>=1 && list.size()>=k){ return list.get(k-1); } return null; } public void count(TreeNode p){ Stack<TreeNode> stack = new Stack<>(); while(!stack.empty() || p!=null) { if(p!=null){ stack.push(p); p = p.left; } else{ p = stack.pop();//注意!!! list.add(p); p = p.right; } } } }
    Processed: 0.010, SQL: 10