Find下一个Node in BST

给定一个node,找inorder traversal 里下一个。

最直接的想法是inorder遍历整个bst,然后在遍历的结果中查找。但是这样耗费多余的空间和时间。

geeksforgeek

(1)有parent指针

在cc150上有很好的讲解

三种情况:

i 当前node的right != null, 则返回leftmost of right subtree

ii 当前node.right == null

如果node为其parent的左孩子,则可以直接返回node.parent

如果node为其parent右孩子,则一直向上走直到node在parent left subtree

Node inorderSucc(Node n){
	if(n has a right subtree){
		return leftmost child of right subtree
	}else{
		while(n is a right child of n.parent){
			n = n.parent; // go up
		}
		return n.parent; // Parent has not been traversed
	}
}

  实际代码:

 1 public static TreeNode inorderNext(TreeNode node){
 2         if(node == null) return null;
 3
 4         if(n.parent == null || node.right!= null){
 5             return leftMostChild(node.right);
 6         }else{
 7
 8             TreeNode cur = node;
 9             TreeNode parent = cur.parent;
10             // Go up until we’re on left instead of right
11
12             while(parent != null && parent.left != cur){
13                 cur = parent;
14                 parent = parent.parent;
15             }
16             return parent;
17         }
18     }
19     public static TreeNode leftMostChild(TreeNode n) {
20         if(n == null) {
21             return null;
22         }
23         while(n.left!= null){
24             n = n.left;
25         }
26         return n;
27     }

(2) 没有parent指针  http://www.geeksforgeeks.org/inorder-successor-in-binary-search-tree/

其实唯一不同的就是找parent或者gradparent那部分,这时候我们需要直到这棵树的root,从上向下遍历,记录parent

 1 public TreeNode findSuccssor(TreeNode node, TreeNode root){
 2
 3         if(node.right != null){
 4             return leftMostChild(node.right);
 5         }
 6         TreeNode succ = null;
 7         //need to start from root, and search for successor down the tree
 8         while(root != null){
 9             if(root.val < node.val){
10                 //node if on right subtree
11
12                 root = root.right;
13             }else if(root.val > node.val){
14                 //node is on left subtree
15                 succ = root;
16                 root = root.left;
17             }else{
18                 //root.val == node.val;
19                 break;
20             }
21         }
22
23         return succ;
24     }

时间: 2024-10-22 00:42:06

Find下一个Node in BST的相关文章

LeetCode OJ:Populating Next Right Pointers in Each Node II(指出每一个节点的下一个右侧节点II)

Follow up for problem "Populating Next Right Pointers in Each Node". What if the given tree could be any binary tree? Would your previous solution still work? Note: You may only use constant extra space. For example,Given the following binary tr

Node.js成为下一个大事件的七大原因

现代的开发人员旨在于定期创造新的东西,可能每隔一两个月会交付推出一项新的技术.一些没有很好派生和管理地技术当然就会很快地消失.Node.js似乎与这些技术截然不同,自2009年推出以来,它目前的技术已经相当成熟,并且越来越受欢迎! Node.js是为在服务器端和客户端使用JavaScript创建应用程序的一个开源的平台.JavaScript的增涨使用已经改变了今天的开发主体,在这样的一个大背景下,Node.js现在已经成为了很多开发人员的重要工具.Node.js使用了Google的V8引擎,它有

LeetCode 1019. Next Greater Node In Linked List (链表中的下一个更大节点)

题目标签:Linked List, Stack 题目给了我们一个 Linked List,让我们找出对于每一个数字,它的下一个更大的数字. 首先把 Linked List 里的数字 存入 ArrayList, 方便后面的操作. 然后遍历 ArrayList,首先每一个数字,都会存入stack:所以就可以利用stack回到之前的数字,存入它的 next Greater Node. Java Solution: Runtime:  39 ms, faster than 65 % Memory Usa

寻找二叉查找树中的下一个结点

一,问题描述 给定一棵二叉查找树,以及某个结点的值.查找该结点的下一个结点.如果该结点是最大的,则返回 null 对于二叉查找树而言,它是中序遍历有序的.某结点的下一个结点 就是:中序遍历输出的下一个结点. 二,问题分析 假设需要查找 node 结点的下一个结点,需要考虑三种情况: ①node 节点有右孩子 下一个结点就是以node结点的右孩子为根的子树中的最左下结点.如下图:node=8,它的下一个结点为12. ②node 节点没有右孩子时,node节点是其父结点的左孩子.如下图,结点8的下一

手把手教你实现一个完整的BST(超级详细)

查找基本分类如下: 线性表的查找 顺序查找 折半查找 分块查找 树表的查找 二叉排序树 平衡二叉树 B树 B+树 散列表的查找 今天介绍二叉排序树. 二叉排序树 ( Binary Sort Tree ) 又称为二叉查找树,它是一种对排序和查找都很有用的特殊二叉树. 1. 二叉排序树的定义 二叉排序树是具有如下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值均小于它的根节点的值. 若它的右子树不为空,则右子树上的所有节点的值均大于它的根节点的值. 它的左子树.右子树也均为二叉排序树. 二

获取第下一个兄弟元素 屏蔽浏览器的差异(nextElementsibling)

//获取element下一个兄弟元素 function getNextElementSibling(element){ //能力检测 判断是否支持nextElementSibling if(element.nextElementSibling){ return element.nextElementSibling; }else{ //获取下一个兄弟节点 var node = element.nextSibling; //如果没有下一个节点,此时null while(node && node

JS函数:返回下一个元素节点

1 //寻找先一个元素节点的函数,把一个元素的下一个节点(nextSibing)作为参数传给该函数,经过筛选返回元素节点 2 function nextElementSiblings(node){ 3 if(node.nodeType == 1){ 4 return node; 5 } 6 if(node.nextSibling){ 7 return nextElementSiblings(node.nextSibling); 8 } 9 return null; 10 }

4.6 找出二叉树中指定节点的下一个节点(中序后继),假定每个节点有父指针。

5 / 2 6 / \ 1 4 7 / 3 class Node{ Node left; Node right; Node parent; int val; } /** 1.如果有右子树,则结果为右子树的最左节点. 2.如果没有右子树,则需要回到父节点,如果当前节点是父节点的左子树,则父节点就是结果,如果不是继续向上再找父节点. */ public TreeNode inorderSucc(TreeNode n){ if(n==null) return null; if(n.right!=nul

手把手教你从购买vps到搭建一个node服务器

要准备什么? 1.5刀 2.最好有FQ软件(可以用蓝灯) let's Go! 一.vps购买 vps可以选择digital ocean(do) 链接 ,由于是外国网站,响应比较慢,所以最好翻个墙. github有一个学生包的优惠,可以赠送一个50刀do优惠券.关于github学生包的申请可以去百度,申请这个需要有一个edu账号或者学生证明.github学生包,我申请大概花了2天时间,就上传了学生证 申请好了我们就一步一步的开始选购吧 1.注册账号并登录 2.确认了email后首先要激活账户 如果