美文网首页
面试题54:二叉树的第K大节点

面试题54:二叉树的第K大节点

作者: 繁星追逐 | 来源:发表于2019-11-12 14:25 被阅读0次

给定一颗二叉搜索树,请找出排名第k的结点。

思路一
其实就可以转换成二叉树的中序遍历,同时统计节点数
递归解法如下:

/**
     * 递归中序遍历
     */
    int index = 0; //计数器
    TreeNode KthNode1(TreeNode root, int k)
    {
        if(root != null){ //中序遍历寻找第k个
            TreeNode node = KthNode1(root.left,k);
            if(node != null)
                return node;
            //共性操作以及返回值
            index ++;
            if(index == k)
                return root;
            //左子树中没有找到,继续遍历右子树的节点
            node = KthNode1(root.right,k);
            if(node != null)
                return node;
        }
        return null;
    }

    /**
     * 递归解法二
     */
    ArrayList<TreeNode> treenode=new ArrayList<TreeNode>();
    TreeNode KthNode2(TreeNode pRoot, int k) {
        InOrder(pRoot);
        if(treenode.size()<1||k<1||k>treenode.size())
            return null;
        //返回集合索引为k-1的节点
        return treenode.get(k-1);

    }
    //中序遍历
    public void InOrder(TreeNode node)
    {
        if(node!=null)
        {
            InOrder(node.left);
            treenode.add(node);
            InOrder(node.right);
        }
    }

使用栈中序

public class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;

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

        }

    }

    /**
     * 非递归中序遍历
     * @param pRoot
     * @param k
     * @return
     */
    TreeNode KthNode(TreeNode pRoot, int k)
    {
       if (pRoot == null || k <= 0) return null;
       //使用栈保存中间节点
        LinkedList<TreeNode> stack = new LinkedList<>();
        int count = 0;
        while (pRoot != null || !stack.isEmpty()){
            //先找到树最左下的节点
            while (pRoot != null){
                stack.push(pRoot);
                pRoot = pRoot.left;
            }
            if (!stack.isEmpty()){
                pRoot = stack.pop();
                if (++count == k) return pRoot;
                //找到此根节点的右子树,循环往复
                pRoot = pRoot.right;
            }
        }
        return null;
    }

相关文章

  • 堆排序

    完全二叉树 完全二叉树:树深为k层,则除k层外,k-1层的节点全满,且第k层的节点向左靠拢 称为完全二叉树 堆 一...

  • 相关树

    二叉树 性质: 第 n 层最多有 2(n-1) 个节点 深度为 k 的二叉树最多有 2k - 1 个节点 对于任何...

  • 剑指offer第二版-54.二叉搜索树的第k大节点

    本系列导航:剑指offer(第二版)java实现导航帖 面试题54:二叉搜索树的第k大节点 题目要求:找出二叉搜索...

  • Leetcode-面试题 02.02 返回倒数第 k 个节点

    面试题 02.02. 返回倒数第 k 个节点[https://leetcode-cn.com/problems/k...

  • 面试题54:二叉树的第K大节点

    给定一颗二叉搜索树,请找出排名第k的结点。 思路一其实就可以转换成二叉树的中序遍历,同时统计节点数递归解法如下: ...

  • 剑指offer之(链表和栈)

    题目列表链表面试题06. 从尾到头打印链表面试题18. 删除链表的节点面试题22. 链表中倒数第k个节点面试题24...

  • 2018-07-12

    今天实现的1.二叉树中,找所有的左叶子节点2.二叉树的中序遍历找第K个,后继节点优化

  • 863. All Nodes Distance K in Bin

    二叉树中所有距离为k的节点。 给定一个二叉树,一个目标节点,一个整数值k,返回到目标节点距离为k的所有节点的值的列...

  • Leetcode 993. 二叉树的堂兄弟节点

    题目描述 在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。 如果二叉树的两...

  • Leetcode 993. 二叉树的堂兄弟节点

    题目描述 在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。 如果二叉树的两...

网友评论

      本文标题:面试题54:二叉树的第K大节点

      本文链接:https://www.haomeiwen.com/subject/ysiyuctx.html