0. 中序遍历时的后继节点(successor)

如当前节点为 x,其后继节点包含两种情况:

  • 右子树非空,则其后继为其右子树的最左节点(最小值所在的节点)
  • 右子树为空,则其后继为该节点的最底层的祖先节点;

    BST_SUCCESSOR(x)
    if x.right != NILreturn BST_MINIMUM(x.right)
    y = x.p
    while y != NIL && x == y.rightx = yy = y.p
    return y

其中搜索最小关键字元素算法如下:

BST_MINIMUM(x)
while x != NIL && x.left != NILx = x.left
return x

1. 一路沿左分支遍历

// BinNode<T>* x;while (x){visit(x->data);                     // 有点先序的例子了S.push(x);x = x->lChild;
}// 直到到达最左,或者为叶子结点,或者为没有左孩子,右孩子的内部结点;// 总之,都是最左的结点;
  • 当然,与之相对应的右分支可以用 Stack 存储,也可以使用 Queue,视具体的程序逻辑而定;

2. 二叉搜索树的 search 与 insert

因为是二叉搜索树,所以是排过序的。当要插入一个元素时,一定要插入在合适的位置,而插入的位置由 search 确定:

template <typename T>
BinNode<T>*& search_rec(BinNode<T>* x, const T& e, BinNode<T>*& hot){if (!x || (e == x->data)) return x;// 查找到该元素,或者应该出现的位置为空节点,而这个位置就作为插入的位置;hot = x;                         // 保存当前结点,经过前面的 if,当前结点显然不是要返回的点,也即分别在左右孩子中return e < x->data ? search_rec(x->lChild, e, hot) : search_rec(x->rChild, e, hot);
}// _root, _hot 均为私有成员变量
template <typename T>
BinNode<T>*& BST<T>::search(const T& e){return search_rec(_root, e, _hot = NULL);
}template <typename T>
BinNode<T>* BST<T>::insert(const T& e){BinNode<T>* x = search(e);if (x->data == e) return x;x = new BinNode<T>(e, _hot);++_size;updateHeightAbove(x);return x;
}

转载于:https://www.cnblogs.com/mtcnn/p/9423709.html

二叉树的常用操作(节点的后继节点)相关推荐

  1. 算法练习day10——190328(二叉树的先序、 中序、 后序遍历, 包括递归方式和非递归方式、找到一个节点的后继节点、二叉树的序列化和反序列化)

    1.实现二叉树的先序. 中序. 后序遍历, 包括递归方式和非递归方式 1.1 访问节点的顺序 节点访问顺序如下图所示: 访问顺序:1 2 4 4 4 2 5 5 5 2 1 3 6 6 6 3 7 7 ...

  2. 左神算法基础班4_4_3在二叉树中找到一个节点的后继节点

    Problem: 在二叉树中找到一个节点的后继节点 [题目] 现在有一种新的二叉树节点类型如下: public class Node { public int value; public Node l ...

  3. 数据结构:在一个单链表中,若删除p指向节点的后继节点,则执行的操作为:( )

    在一个单链表中,若删除p指向节点的后继节点,则执行的操作为:( ) A.q=p->next; p->next=p->next->next; free(q) B.p=p-> ...

  4. [LeetCode] 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. No ...

  5. 笔试面试常考数据结构-单链表常用操作编程实现

    单链表是笔试以及面试手写代码中常考的数据结构之一.下面实现了单链表的常见操作:创建单链表.删除节点.打印单链表(包括正向打印以及逆向打印).反转单链表.找出单链表的倒数第K个节点.合并两个有序单链表等 ...

  6. 二叉查找树(BST)的基本概念及常用操作

    二叉查找树 二叉查找树(Binary Search Tree),也称二叉搜索树.有序二叉树(ordered binary tree),排序二叉树(orted binary tree),是指一棵空树或者 ...

  7. 用pv操作描述如下前驱图_LinkedList实现分析(二)——常用操作

    上一篇文章LinkedList实现分析(一)--LinkedList初探与对象创建介绍了LinkedList中的一些重要属性和构造方法,下面我们将详细介绍一下LinkedList提高的常用方法的实现原 ...

  8. JavaScript HTML DOM元素节点常用操作接口

    在文档对象模型 (DOM) 中,每个节点都是一个对象.DOM 节点有三个重要的属性 : 1. nodeName : 节点的名称 2. nodeValue :节点的值 3. nodeType :节点的类 ...

  9. python 二叉树中所有距离为k的节点_Redis:从应用到底层,一文帮你搞定

    高清思维导图已同步Git:https://github.com/SoWhat1412/xmindfile,关注公众号sowhat1412获取海量资源 总感觉哪里不对,但是又说不上来 1.基本类型及底层 ...

最新文章

  1. 分享一些书籍,方方面面,很多值得一读
  2. 2016中国APP分类排行榜发布暨颁奖晚宴 —— 兰亭修禊少长有王谢 黔香阁暖高见望诸公...
  3. 【CodeForces - 266C】Below the Diagonal (递归,子问题,贪心模拟)
  4. Android开发实战二之Hello Android实例
  5. HBase全网最佳学习资料汇总
  6. 银辉机器人说明说_银辉儿童电动声控玩具 智能编程对话尊尼机器人 男孩礼物...
  7. vue 使用axios 出现跨域请求的两种解决方法
  8. 开源大数据:MLSQL
  9. SQL 数据表基本操作
  10. 快速求实对称矩阵特征向量的技巧
  11. 服务器系统用哪个版本好,windows服务器系统哪个版本好用
  12. 网络安全专题报告:零信任安全,数字时代的主流安全架构
  13. 百度360腾讯竞购搜狗
  14. CS上线Linux--坑太多了
  15. Android 地图导航调用百度地图、高德地图、腾讯地图,ffmpeg音视频开发实战5
  16. 微信如何取消企业微信消息通知 ?
  17. 从Node.js访问文件系统
  18. 卸载MATLAB7.0
  19. 手游代理加盟费贵不贵?
  20. 成功在于实践作文_成功源于行动作文800字

热门文章

  1. 人这辈子过完70,接下来就是一步一个坎
  2. 电商培训有用是有前置条件的
  3. 职位越高的人,越容易犯5个错
  4. Linux环形缓冲区原理
  5. 为什么Windows的兼容性这么强大,到底用了什么技术?
  6. 为什么现在的手机不像以前一样可以换电池?
  7. 【以太坊源码阅读】椭圆曲线加密和EIP155
  8. 解决Golang程序运行时占用内存不断增加的问题
  9. Cause: java.sql.SQLException: Unknown initial character set index ‘255‘ received from server. Initia
  10. SpringBoot配置绑定的两种方式