題目面試
給定一棵二叉樹和其中的一個的節點,如何找出中序遍歷的下一節點。樹中的節點除了有兩個分別指向左、右子樹的指針,還有一個指向父節點的指針。算法
如:中序遍歷序列爲 {d,b,h,e,i,a,f,c,g}。ide
問題分析測試
咱們根據題目進行分析,要想求出其中一個樹節點中序遍歷的下一節點是什麼,咱們須要對每一個單獨的狀況分別進行分析。動畫
根據中序遍歷的規律(先遍歷左子節點,而後遍歷根節點,最後遍歷右子節點),下一節點可能存在的狀況以下。3d
動畫實現指針
狀況一:若是查找的節點有右子樹,則下一結點在它右子樹的最左子節點。以下圖中的 b 節點的下一節點爲 h 節點blog
若是右子樹沒有左子節點,則下一節點爲右子節點。以下圖中的 c 節點的下一節點爲 g 節點ip
狀況二:若是當前節點沒有右子樹且是父節點的左子節點,則它的下一節點是它的父節點。以下圖中的 d 節點的下一節點爲 b 節點。it
狀況三:若是當前的節點沒有右子樹且是父節點的右子節點。對於這種狀況,咱們就一直向它的父節點遍歷,直到找到第一個是父節點的左子節點的節點。若是該節點的父節點存在,則父節點就是要查找的下一節點。以下圖中的 i 的下一節點爲 a。
再好比沒有找到這樣的節點,下節點爲空。如圖中的 g 節點的下一結點爲空。
代碼實現
JavaScript
Java
Python
測試用例
普通測試 —— 徹底二叉樹、非徹底二叉樹
特殊測試 —— 只要左子節點的二叉樹、只有右子節點的二叉樹、只有一個結點