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

/*
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){   
        if(pRoot == null || k == 0){
            return null;
        }
        Stack<TreeNode> s = new Stack<TreeNode>();
        TreeNode node = pRoot;
        s.add(node);
        while(node.left != null){
            s.add(node.left);
            node = node.left;
        }
        int num = 0;
        while(!s.empty()){
            TreeNode temp = s.pop();
            num ++;
            if(num==k){
                return temp;
            }
            if(temp.right != null){
                temp = temp.right;
                s.add(temp);
                while(temp.left != null){
                    s.add(temp.left);
                    temp = temp.left;
                }
            }
        }
        return null;
    }


}

 

转载于:https://www.cnblogs.com/q-1993/p/10979540.html

### 回答1: 二叉搜索树的先序遍历序列中,第一个结点为根结点。由于二叉搜索树的特性,左子树的所有结点都小于根结点,右子树的所有结点都大于根结点。因此,我们可以根据这个特性来判断两个结点的位置关系,从而找到它们的最近公共祖先结点。 具体做法如下: 1. 如果根结点为 null 或者是 p 或者是 q,则返回根结点2. 如果 p 和 q 分别位于根结点的左右子树中,则返回根结点3. 如果 p 和 q 都位于根结点的左子树中,则递归查找左子树中的最近公共祖先结点4. 如果 p 和 q 都位于根结点的右子树中,则递归查找右子树中的最近公共祖先结点。 代码实现如下: ``` public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if (root == null || root == p || root == q) { return root; } if (p.val < root.val && q.val < root.val) { return lowestCommonAncestor(root.left, p, q); } if (p.val > root.val && q.val > root.val) { return lowestCommonAncestor(root.right, p, q); } return root; } ``` ### 回答2二叉搜索树(BST)是一种特殊的二叉树,其左子树中所有节点的都小于根节点的,右子树中所有节点的都大于根节点的。由于二叉搜索树的特殊性质,我们可以利用这一特点来寻找任意两个节点的最近公共祖先。 首先,我们可以利用BST的性质将先序遍历序列构造成一棵二叉搜索树。接着,我们考虑给定的两个节点x和y的与根节点比较。如果它们的都小于根节点的,说明它们都在根节点的左子树中,因此我们继续在左子树中寻找它们的公共祖先;如果它们的都大于根节点的,说明它们都在根节点的右子树中,因此我们继续在右子树中寻找它们的公共祖先;如果它们的一个小于根节点的,一个大于根节点的,说明它们分别在根节点的左子树和右子树中,因此根节点就是它们的公共祖先。 为了寻找任意两个节点的最近公共祖先,我们可以采用递归的方法,在每一次递归中进行上述比较,直到找到它们的公共祖先或者根节点为空。具体过程如下: 1. 若根节点为空,返回空; 2. 若根节点的等于x或y的,返回根节点; 3. 若x和y的都小于根节点的,继续在左子树中寻找它们的公共祖先; 4. 若x和y的都大于根节点的,继续在右子树中寻找它们的公共祖先; 5. 若x和y的分别小于和大于根节点的,说明它们的公共祖先就是根节点,返回根节点。 以上就是利用BST的性质寻找任意两个节点的最近公共祖先的方法。该方法的时间复杂度为O(h),其中h为BST的高度。如果BST不平衡,可能会出现最坏情况,时间复杂度会退化到O(n),其中n为节点个数。 ### 回答3二叉搜索树是一种特殊的二叉树,它的每个结点都比它左子树中的所有结点大,比右子树中的所有结点小。也就是说,二叉搜索树中左子树的都比根节点小,右子树的都比根节点大。 给定一棵二叉搜索树的先序遍历序列,我们可以很方便地构建这棵二叉搜索树。首先,先序遍历序列的第一个元素一定是根节点的,我们可以将其作为二叉搜索树的根节点。然后,依次将后面的元素插入到二叉搜索树中,按照左小右大的原则进行比较,直到插入完毕。 接下来考虑如何找出任意两结点的最近公共祖先结点(简称 lca)。我们可以先找到两个结点二叉搜索树中的位置,然后从根节点开始往下遍历,找到它们最近的公共祖先结点。具体的方法为: 1. 将根节点设为当前节点,对于给定的两个结点,比较它们的与当前节点的大小关系。 2. 如果两个结点都小于当前节点的,则它们一定在当前节点的左子树中,将当前节点移动到左子节点。 3. 如果两个结点都大于当前节点的,则它们一定在当前节点的右子树中,将当前节点移动到右子节点。 4. 如果两个结点一个大于当前节点的,一个小于当前节点的,则当前节点就是它们的最近公共祖先结点。 需要注意的是,因为是二叉搜索树,所以当两个结点都小于或都大于当前节点的时,它们的最近公共祖先结点才可能在当前节点的子树中。如果其中一个结点等于当前节点的,那么当前节点就是它们的最近公共祖先结点。 综上所述,我们可以通过先序遍历序列构建二叉搜索树,并在二叉搜索树中查找任意两结点的最近公共祖先结点。时间复杂度为 O(log n),其中 n 表示二叉搜索树中的结点数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值