求二叉搜索树的前驱节点和后继节点

前驱结点:节点val值小于该节点val值并且值最大的节点

后继节点:节点val值大于该节点val值并且值最小的节点

二叉树的节点val值是按照二叉树中序遍历顺序连续设定。

前驱结点

  • 如图4的前驱结点是3
  • 2的前驱结点是1
  • 6的前驱结点是5

后继节点

  • 7的后继结点是8
  • 5的后继节点是6
  • 2的后继节点是3

前驱节点

  1. 若一个节点有左子树,那么该节点的前驱节点是其左子树中val值最大的节点(也就是左子树中所谓的rightMostNode)
  2. 若一个节点没有左子树,那么判断该节点和其父节点的关系 
    2.1 若该节点是其父节点的右边孩子,那么该节点的前驱结点即为其父节点。 
    2.2 若该节点是其父节点的左边孩子,那么需要沿着其父亲节点一直向树的顶端寻找,直到找到一个节点P,P节点是其父节点Q的右边孩子(可参考例子2的前驱结点是1),那么Q就是该节点的后继节点

后继节点

  1. 若一个节点有右子树,那么该节点的后继节点是其右子树中val值最小的节点(也就是右子树中所谓的leftMostNode)
  2. 若一个节点没有右子树,那么判断该节点和其父节点的关系 
    2.1 若该节点是其父节点的左边孩子,那么该节点的后继结点即为其父节点 
    2.2 若该节点是其父节点的右边孩子,那么需要沿着其父亲节点一直向树的顶端寻找,直到找到一个节点P,P节点是其父节点Q的左边孩子(可参考例子2的前驱结点是1),那么Q就是该节点的后继节点

实现

  1. /**
  2. * 前驱元素
  3. * **/
  4. public BSTreeNode<T> Pred(BSTreeNode<T> node) {
  5. if (node.left != null) {
  6. return Max(node.left);
  7. }
  8. BSTreeNode<T> parent = node.parent;
  9. while (parent != null && node != parent.right) {
  10. node = parent;
  11. parent = node.parent;
  12. }
  13. return parent;
  14. }
  1. /**
  2. * 后继元素
  3. * **/
  4. public BSTreeNode<T> Succ(BSTreeNode<T> node) {
  5. if (node.right != null) {
  6. return Min(node.right);
  7. }
  8. BSTreeNode<T> parent = node.parent;
  9. while (parent != null && node != parent.left) {
  10. node = parent;
  11. parent = node.parent;
  12. }
  13. return parent;
  14. }

null

时间: 2024-10-16 00:48:08

求二叉搜索树的前驱节点和后继节点的相关文章

二叉搜索树的第k大的节点

题目 给定一颗二叉搜索树,请找出其中的第k大的结点. 思路 如果中序遍历一棵二叉搜索树,遍历序列的数值则是递增排序,因此只需中序遍历一个二叉搜索树即可. #include <iostream> using namespace std; struct tree { double data; struct tree *left,*right; tree(int d=0):data(d) { left=right=nullptr; } }; class Solution { public: void

[LeetCode] 285. Inorder Successor in BST 二叉搜索树中的中序后继节点

Given a binary search tree and a node in it, find the in-order successor of that node in the BST. Note: If the given node has no in-order successor in the tree, return null. 给一个二叉搜索树和它的一个节点,找出它的中序后继节点,如果没有返回null. 解法1: 用中序遍历二叉搜索树,当找到root.val = p.val的时

二叉搜索树找前驱和后继

输入N个数,找每个数的前驱和后继.如果没有前驱或后继,输出-1: 思路: 如果有右子树,则右子树的最小值为当前节点的后继:否则后继为当前节点往祖先搜索,第一次是左孩子的节点的父亲的值: 如果有左子树,则左子树的最大值为当前节点的前驱:否则前驱为当前节点往祖先搜索,第一次是右孩子的节点的父亲的值: #include "bits/stdc++.h" using namespace std; typedef long long LL; const int INF = 0x3f3f3f3f;

二叉搜索树的前驱和后继详细推导

后继和前驱 定义:一个结点的后继,是大于x.key的最小关键字的结点. 一个结点的前驱,是小于x.key的最大关键字的结点. 思路:找一个结点的前驱或者后继,无非是在三个区域找. 首先分析前驱: 满足两个条件,一是要小于当前键值,那么只有LP和LS区可以找. 二要求是其中最大的值.我们知道,对于LP来说,X.LS.RS都属于他的右子树,那么,X.LS和RS都是大于它的. 所以很显然,前驱就是LS中的最大值,即前驱 = 左子树中的最大值.条件是:存在左子树. 那不存在左子树只有左父母的情况呢? 那

给定n求二叉搜索树的个数

Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For example,Given n = 3, your program should return all 5 unique BST's shown below. 1 3 3 2 1 \ / / / \ 3 2 1 1 3 2 / / \ 2 1 2 3 confused what "{1,#,2,3}&

[Swift]LeetCode285. 二叉搜索树中的中序后继节点 $ Inorder Successor in BST

Given a binary search tree and a node in it, find the in-order successor of that node in the BST. The successor of a node p is the node with the smallest key greater than p.val. Example 1: Input: root = [2,1,3], p = 1 Output: 2 Explanation: 1's in-or

[LeetCode] Inorder Successor in BST II 二叉搜索树中的中序后继节点之二

Given a binary search tree and a node in it, find the in-order successor of that node in the BST. The successor of a node p is the node with the smallest key greater than p.val. You will have direct access to the node but not to the root of the tree.

[LeetCode] Lowest Common Ancestor of a Binary Search Tree 二叉搜索树的最小共同父节点

Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST. According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes v and w as the lowest node in T that has

C++实现二叉搜索树的常用操作

实现操作 (1)二叉搜索树的建立 (2)二叉搜索树的插入 (3)二叉搜索树的三种递归遍历(前序.中序和后续) (4)二叉搜索树的三种非递归遍历(前序.中序和后续) (5)二叉搜索树的逐层打印 (6)搜索某一个字符(递归算法) (7)搜索一个字符(非递归算法) (8)查找最大元素 (9)查找最小元素 有时间再实现: (10)二叉搜索树的前驱和后继查找 (11)二叉搜索树的删除 源码分析: #include <iostream> #include <stack> #include &l