程式設計師面試經典--二叉查詢樹節點的“下一個結點”
4.6問題:
設計一個演算法,找出二叉樹中指定的結點“下一個”結點(也即中序後繼)。可以假定每個結點都含有指向父節點的連結。
思考:
回憶一下中序遍歷,它會先遍歷左子樹,然後是當前節點,接著右子樹,要解決這個問題需要非常小心。
假定我們有一個假想的結點,先是左子樹,然後是當前結點,最後就是右子樹,目標結點當然是在右子樹,那麼是右子樹的哪一個呢?很簡單,就是右子樹的最左邊的那個結點。在這種情況下,只需返回當前結點右子樹的最左邊的結點。有點兒繞啊。
若當前節點沒有右子樹又該怎麼辦?這種情況就比較複雜了。這時我們就需要返回到上一層結點,就是當前節點的父節點。按照中序遍歷的順序,如果當前節點是其父節點的左孩子,那麼“下一個結點”就是其父節點。如果當前結點是其父節點的右孩子,那麼說明它的父節點已經被訪問過了,那就需要往其父結點的父結點訪問,依此類推的網上需找,直至找到第一個未訪問的結點,若沒有。則表明當前節點就是中序遍歷的最後一個結點。(全是文字描述,需要仔細分析,不是很直觀)
下面就是該演算法的實現程式碼:
public TreeNode inorderSucc(TreeNode n){ if(n == null) return null; //找到右子結點,則返回右子樹裡最左邊的結點。 if(n.right != null){ return leftMostChild(n.right); }else{ TreeNode q = n; TreeNode x = q.parent; //向上直至位於左邊而不是右邊 while(x != null && x.left !=q){//此處需要仔細分析 q = x; x = x.parent; } return x; } } public TreeNode leftMostChild(TreeNode n){//返回當前子樹的最左邊結點。 if(n == null){ return null; } while(n.left != null){ n=n.left; } return n; }
相關推薦
程式設計師面試經典--二叉查詢樹節點的“下一個結點”
4.6問題: 設計一個演算法,找出二叉樹中指定的結點“下一個”結點(也即中序後繼)。可以假定每個結點都含有指向父節點的連結。 思考: 回憶一下中序遍歷,它會先遍歷左子樹,然後是當前節點,接著右子樹,要解決這個問題需要非常小心。 假定我們有一個假想的結點,先是左子樹,然後是當
二叉查詢樹節點的查詢、插入和刪除
二叉查詢樹常常會考到和使用到,本文練習下它的幾個基本操作,即節點的查詢、插入和刪除及找最大值、最小值等。 1,二叉查詢樹的查詢 由於二叉查詢樹的性質是,每個節點的關鍵字值大於其左子樹的所有節點,同時
二叉查詢樹節點的刪除
簡介 本文將介紹如何從二叉查詢樹中刪除某個任意的節點。由於二叉樹特有的結構,即: (1)所有左子樹中的節點小於等於根節點 (2)所有右子樹中的節點大於等於根節點 (3)對於任意節點滿足(1)(2) 所以二叉查詢樹節點刪除關鍵在於如何保證不破壞二叉查詢樹
樹篇3-平衡二叉查詢樹之紅黑樹
一、概述 紅黑樹是一種自平衡樹在電腦科學中。二叉樹的每個節點都有一個額外的位,該位通常被解釋為節點的顏色(紅色或黑色)。這些顏色位用於確保樹在插入和刪除期間保持近似平衡。通過以滿足某些屬性的方式用兩種顏色之一繪製樹的每個節點來
樹篇2-平衡二叉查詢樹之AVL樹
一、AVL樹定義 在資料結構中,AVL樹是最先發明的自平衡二叉查詢樹。在AVL樹中任何節點的兩個子樹的高度差的絕對值不能超過一,所以它也被稱為高度平衡樹。查詢、插入和刪除在平均和最壞情況下都是O(log n)。增加和刪除可能需要通過一次
樹篇1-二叉查詢樹
一、概述 在看JDK原始碼時,看到關於map相關的,看到HashMap時,一部分原始碼與紅黑樹有關。索性就將樹這種資料結構從頭學一遍,記錄下來,給自己還有他人留個參考和學習的資料。 &nbs
查詢演算法 淺談演算法和資料結構: 七 二叉查詢樹 淺談演算法和資料結構: 十一 雜湊表
閱讀目錄 1. 順序查詢 2. 二分查詢 3. 插值查詢 4. 斐波那契查詢 5. 樹表查詢 6. 分塊查詢 7. 雜湊查詢 查詢是在大量的資訊中尋找一個特定的資訊元素,在計算機應用中,查詢是常用的基本運算,例如編譯程式中符號表的查詢。本文
二叉樹、二叉查詢樹、B-、B+樹
1.0二叉樹 一種樹結構,每個節點至多隻有兩個子樹,且子樹有左右子樹之分,其次序不能隨意顛倒 1.1 二叉查詢樹 又稱二叉搜尋樹或二叉排序樹或者B樹,是最基本的查詢樹,是AVL樹,紅黑樹等查詢樹的基礎。 1.1.1 二叉查詢樹的特點 二叉查
【模板】二叉查詢樹
果然這些資料結構還是要自己寫一遍才熟悉啊。。。這次也是加深了我對指標的認識,以前都不怎麼注意的 二叉查詢樹 二叉查詢樹,每一個節點有左右兒子,然後這個節點的值大於左兒子,小於右兒子,那麼根據定義不難得出程式碼,先配個圖以便於理解(網上也有不少)~ 二叉查詢樹一共有三種操作:查詢
BZOJ 1564: [NOI2009]二叉查詢樹
聽說n<=70? 我一直以為n<=400000...... 區間DP #include<cstdio> #include<algorithm> using namespace std; int n,K,F[105][105][105],b[105],Sum
【一次過】Lintcode 86. 二叉查詢樹迭代器
設計實現一個帶有下列屬性的二叉查詢樹的迭代器: next()返回BST中下一個最小的元素 元素按照遞增的順序被訪問(比如中序遍歷) next()和hasNext()的詢問操作要求均攤時間複雜度是O(1) 樣例 對於下列二叉查詢樹,使用迭代器進行中序遍歷的結果為&nbs
二叉查詢樹中的刪除
刪除 將一個結點從二叉查詢樹中刪除之後,剩下的結點可能會不滿足二叉查詢樹的性質,因此,在刪除結點之後要對樹進行調整,使其滿足二叉查詢樹的性質。根據結點的孩子的數量,將刪除操作分為三種情況,我們記要刪除的結點為z,實際上刪除的結點為y。 1. z結點沒有孩子。 如
演算法導論 第十二章:二叉查詢樹 筆記(二叉查詢樹、查詢二叉查詢樹、插入和刪除、隨機構造的二叉查詢樹)
二叉查詢樹是一種樹資料結構,它與普通的二叉樹最大的不同就是二叉查詢樹滿足一個性質:對於樹中的任意一個節點,均有其左子樹中的所有節點的關鍵字值都不大於該節點的關鍵字值,其右子樹中的任意一個節點的關鍵字值都不小於該節點的關鍵字值。 在二叉查詢樹上可以進行搜尋、取最小值、取最大值、取指定節點的前驅
二叉查詢樹深度講解
* 二叉查詢樹(BST)(自己動手寫API系列三)* 這次的教學可能會比較長一點 所以也希望大家可以耐心看 下面的程式碼裡面會貼一些講解 覺得煩也沒事 最下面我會把全部的程式碼貼出來 你可以拿純淨的 然後這次的語言我還是 選擇用java 如果不會Java的 不著急要程式
Delete Node in a BST 二叉查詢樹的查詢、插入和刪除 - Java實現
https://leetcode.com/problems/delete-node-in-a-bst Given a root node reference of a BST and a key, delete the node with the given key in the BST. Return t
LeetCode總結 -- 二叉查詢樹篇
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
資料結構與演算法總結——二叉查詢樹及其相關操作
我實現瞭如下操作 插入,查詢,刪除,最大值 樹的高度,子樹大小 二叉樹的範圍和,範圍搜尋 樹的前序,中序,後序三種遍歷 rank 前驅值 在這一版本的程式碼中,我使用了類模板將介面與實現分
C++資料結構 17 二叉查詢樹
Bst(Binary Search Tree) 有以下性質: 每一個元素有一個鍵值,而且不予許重複 左子樹的鍵值都小於根節點的鍵值 右子樹的鍵值都大於根節點的鍵值 左右子樹都是二叉查詢樹 程式碼: #ifndef __BST_H__ #
【模板】二叉搜尋樹(二叉排序樹,二叉查詢樹,BST)
二叉搜尋樹其實就是滿足左結點小於根,右結點大於根這類規則的樹形結構。 1 int n; 2 int a[MAX_N]; 3 int lt[MAX_N], rt[MAX_N]; 4 // 沒有則為-1 5 // 預設a[0]為根結點 6 7 void Insert(int
按資料元素在表中的次序構造一棵二叉查詢樹
二叉排序樹具有如下性質: (1) 若左子樹不空,則左子樹上所有結點的值均小於或等於它的根結點的值; (2) 若右子樹不空,則右子樹上所有結點的值均大於或等於它的根結點的值; (3) 左、右子樹也分別為二叉排序樹. 元素(19.14.22.01.66.21