返回顶部
首页 > 资讯 > 前端开发 > JavaScript >如何寻找二叉树的下一个节点
  • 936
分享到

如何寻找二叉树的下一个节点

2024-04-02 19:04:59 936人浏览 安东尼
摘要

如何寻找二叉树的下一个节点,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。前言已知一个包含父节点引

如何寻找二叉树的下一个节点,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

前言

已知一个包含父节点引用的二叉树和其中的一个节点,如何找出这个节点中序遍历序列的下一个节点?

问题分析

正如前言所述,我们的已知条件如下:

  • 包含父节点引用的二叉树

  • 要查找的节点

我们要解决的问题:

  • 找出要查找节点中序遍历序列的下一个节点

接下来,我们通过举例来推导下一个节点的规律,我们先来画一颗二叉搜索树,如下所示:

 8    / \   6   13  / \  / \ 3  7 9  15

例如,我们寻找6的下一个节点,根据中序遍历的规则我们可知它的下一个节点是7

  • 8的下一个节点是9

  • 3的下一个节点是6

  • 7的下一个节点是8

通过上述例子,我们可以分析出下述信息:

  • 要查找的节点存在右子树,那么它的下一个节点就是其右子树中的最左子节点

  • 要查找的节点不存右子树:

    • 当前节点属于父节点的左子节点,那么它的下一个节点就是其父节点本身

    • 当前节点属于父节点的右子节点,那么就需要沿着父节点的指针一直向上遍历,直至找到一个是它父节点的左子节点的节点

上述规律可能有点绕,大家可以将规律代入问题中多验证几次,就能理解了。

实现思路

  • 二叉树中插入节点时保存其父节点的引用

  • 调用二叉树的搜索节点方法,找到要查找的节点信息

  • 判断找到的节点是否存在右子树

  • 如果存在,则遍历它的左子树至叶节点,将其返回。

  • 如果不存在,则遍历它的父节点至根节点,直至找到一个节点与它父节点的左子节点相等的节点,将其返回。

实现代码

接下来,我们将上述思路转换为代码,本文代码中用到的二叉树相关实现请移步我的另一篇文章:typescript实现二叉搜索树

搜索要查找的节点

我们需要找到要查找节点在二叉树中的节点信息,才能继续实现后续步骤,搜索节点的代码如下:

import { node } from "./Node.ts";  export default class BinarySearchTree<T> {     protected root: Node<T> | undefined;      constructor(protected compareFn: ICompareFunction<T> = defaultCompare) {         this.root = undefined;     }        // 搜索特定值     search(key: T): boolean | Node<T> {         return this.searchNode(<Node<T>>this.root, key);     }      // 搜索节点     private searchNode(node: Node<T>, key: T): boolean | Node<T> {         if (node == null) {             return false;         }          if (this.compareFn(key, node.key) === Compare.LESS_THAN) {             // 要查找的key在节点的左侧             return this.searchNode(<Node<T>>node.left, key);         } else if (this.compareFn(key, node.key) === Compare.BIGGER_THAN) {             // 要查找的key在节点的右侧             return this.searchNode(<Node<T>>node.right, key);         } else {             // 节点已找到             return node;         }     } }

保存父节点引用

此处的二叉树与我们实现的二叉树稍有不同,插入节点时需要保存父节点的引用,实现代码如下:

export default class BinarySearchTree<T> {     // 插入方法     insert(key: T): void {         if (this.root == null) {             // 如果根节点不存在则直接新建一个节点             this.root = new Node(key);         } else {             // 在根节点中找合适的位置插入子节点             this.insertNode(this.root, key);         }     }        // 节点插入     protected insertNode(node: Node<T>, key: T): void {         // 新节点的键小于当前节点的键,则将新节点插入当前节点的左边         // 新节点的键大于当前节点的键,则将新节点插入当前节点的右边         if (this.compareFn(key, node.key) === Compare.LESS_THAN) {             if (node.left == null) {                 // 当前节点的左子树为null直接插入                 node.left = new Node(key, node);             } else {                 // 从当前节点(左子树)向下递归,找到null位置将其插入                 this.insertNode(node.left, key);             }         } else {             if (node.right == null) {                 // 当前节点的右子树为null直接插入                 node.right = new Node(key, node);             } else {                 // 从当前节点(右子树)向下递归,找到null位置将其插入                 this.insertNode(node.right, key);             }         }     } }   export class Node<K> {     public left: Node<K> | undefined;     public right: Node<K> | undefined;     public parent: Node<K> | undefined;     constructor(public key: K, parent?: Node<K>) {         this.left = undefined;         this.right = undefined;         console.log(key, "的父节点", parent?.key);         this.parent = parent;     }      toString(): string {         return `${this.key}`;     } }

我们来测试下上述代码,验证下父节点引用是否成功:

const tree = new BinarySearchTree(); tree.insert(8); tree.insert(6); tree.insert(3); tree.insert(7); tree.insert(13); tree.insert(9); tree.insert(15);

如何寻找二叉树的下一个节点

在保存父节点引用时折腾了好久也没实现,最后求助了我的朋友_Dreams?。

寻找下一个节点

接下来,我们就可以根据节点的规律来实现这个算法了,实现代码如下:

export class TreeOperate<T> {          findBinaryTreeNextNode(tree: BinarySearchTree<number>, node: number): null | Node<number> {         // 搜索节点         const result: Node<number> | boolean = tree.search(node);         if (result == null) throw "节点不存在";         let currentNode = result as Node<number>;         // 右子树存在         if (currentNode.right) {             currentNode = currentNode.right;             // 取右子树的最左子节点             while (currentNode.left) {                 currentNode = currentNode.left;             }             return currentNode;         }          // 右子树不存在         while (currentNode.parent) {             // 当前节点等于它父节点的左子节点则条件成立             if (currentNode === currentNode.parent.left) {                 return currentNode.parent;             }             // 条件不成立,继续获取它的父节点             currentNode = currentNode.parent;         }         return null;     } }

我们通过一个例子来测试下上述代码:

// 构建二叉搜索树 const tree = new BinarySearchTree(); tree.insert(8); tree.insert(6); tree.insert(3); tree.insert(7); tree.insert(13); tree.insert(9); tree.insert(15); // 寻找下一个节点 const nextNode = treeOperate.findBinaryTreeNextNode(tree, 7); console.log("7的下一个节点", nextNode.toString());
如何寻找二叉树的下一个节点

代码地址

文中完整代码如下:

  • TreeOperate.ts

  • BinarySearchTree.ts

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网JavaScript频道,感谢您对编程网的支持。

--结束END--

本文标题: 如何寻找二叉树的下一个节点

本文链接: https://lsjlt.com/news/80691.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何寻找二叉树的下一个节点
    如何寻找二叉树的下一个节点,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。前言已知一个包含父节点引...
    99+
    2024-04-02
  • C++求解二叉树的下一个结点问题
    目录题目描述解题思路测试代码1)暴力破解2)结合中序排序性质题目描述 给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包...
    99+
    2024-04-02
  • C++怎么求解二叉树的下一个结点
    这篇文章主要讲解了“C++怎么求解二叉树的下一个结点”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++怎么求解二叉树的下一个结点”吧!题目描述给定一个二叉树其中的一个结点,请找出中序遍历顺...
    99+
    2023-06-29
  • 在python二叉树中如何为每个节点关联其右相邻节点
    在python二叉树中如何为每个节点关联其右相邻节点,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。如果用C描述的话,就是一个二叉树节点定义包括右节点指针,左节点指针,和右相连指...
    99+
    2023-06-02
  • Python算法之求n个节点不同二叉树个数
    问题 创建一个二叉树 二叉树有限多个节点的集合,这个集合可能是: 空集 由一个根节点,和两棵互不相交的,分别称作左子树和右子树的二叉树组成 创建二叉树: 创建节点 再创建节点之间的关系 Py...
    99+
    2022-06-05
    节点 算法 个数
  • 刷题系列 - 在二叉树中查找给出节点,并返回以该节点为根的树
    很简答的一道题目,就是二叉树遍历找到某个节点的val是给出值,如果要返回的是以该节点为根节点的树,那么就是按照层级遍历,这里使用递归实现。如果找不到返回为空,如果找到返回该节点即可。# Definition for&nb...
    99+
    2023-06-02
  • C#如何实现二叉查找树
    这篇文章主要介绍了C#如何实现二叉查找树的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#如何实现二叉查找树文章都会有所收获,下面我们一起来看看吧。对于符号表,要支持高效的插入操作,就需要一种链式结构。但单链表...
    99+
    2023-06-30
  • cdn是如何寻找最近的节点
    当用户访问加入cdn服务的网站时,域名解析请求将最终交给全局负载均衡DNS进行处理。全局负载均衡DNS通过一组预先定义好的策略,将最接近用户的节点地址提供给用户,使用户能够得到快速的服务。同时,它还与分布在世界各地的所有cdnC节点保持通信...
    99+
    2024-04-02
  • JavaScript中如何定义二叉查找树
    小编给大家分享一下JavaScript中如何定义二叉查找树,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!树是一种非线性的数据结构...
    99+
    2024-04-02
  • 给出python二叉树两个点该如何求出其最小共同父节点
    本篇文章给大家分享的是有关给出python二叉树两个点该如何求出其最小共同父节点,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。题目是在给出二叉树中两个点p,q,求出其最小共同父...
    99+
    2023-06-02
  • C++实现二叉树的堂兄弟节点查询
    目录一.二叉树的堂兄弟节点1.题目描述2.问题分析3.代码实现1.BFS解法2.DFS解法二.二叉树的堂兄弟节点 II1.题目描述2.问题分析3.代码实现一.二叉树的堂兄弟节点 1....
    99+
    2023-05-18
    C++二叉树堂兄弟节点 C++二叉树节点
  • C#如何实现简单的二叉查找树
    本篇内容介绍了“C#如何实现简单的二叉查找树”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!二叉查找树(Binary Search Tree)...
    99+
    2023-07-02
  • c语言如何构建一个静态二叉树
    这篇文章主要介绍“c语言如何构建一个静态二叉树”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“c语言如何构建一个静态二叉树”文章能帮助大家解决问题。第一、树的构建定义树结构struct BT...
    99+
    2023-06-16
  • JavaScript数据结构与算法之二叉树插入节点、生成二叉树的示例分析
    小编给大家分享一下JavaScript数据结构与算法之二叉树插入节点、生成二叉树的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解...
    99+
    2024-04-02
  • 怎么在java项目中实现一个二叉查找树算法
    今天就跟大家聊聊有关怎么在java项目中实现一个二叉查找树算法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。具体内容如下package 查找;import edu...
    99+
    2023-05-31
    java 二叉查找树 ava
  • JS如何实现的二叉树算法
    这篇文章给大家分享的是有关JS如何实现的二叉树算法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体如下:<!DOCTYPE HTML> <head&...
    99+
    2024-04-02
  • 如何使用Java的平衡二叉树
    这篇文章主要讲解了“如何使用Java的平衡二叉树”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用Java的平衡二叉树”吧!二叉排序树可能的问题给定一个数列{1,2,3,4,5,6},要...
    99+
    2023-06-15
  • C++如何实现二叉树的遍历
    本篇内容介绍了“C++如何实现二叉树的遍历”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!二叉树的遍历Q:什么是二叉树的遍历?A:二叉树的遍历...
    99+
    2023-06-30
  • 怎么在Java中利用二叉查找树算法实现一个排序功能
    这期内容当中小编将会给大家带来有关怎么在Java中利用二叉查找树算法实现一个排序功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。具体如下:public class BinaryNode<T ext...
    99+
    2023-05-31
    java 二叉查找树 排序
  • jquery如何获取父亲节点的第一个子节点
    这篇文章主要讲解了“jquery如何获取父亲节点的第一个子节点”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“jquery如何获取父亲节点的第一个子节点”吧!...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作