(python版)《劍指Offer》JZ57:二叉樹的下一個結點
牛客
我們以上圖為例進行講解,上圖二叉樹的中序遍歷是d,b,h,e,i,a,f,c,g。我們以這棵樹為例來分析如何找出二叉樹的下一個結點。
-
如果一個結點有右子樹,那麼它的下一個結點就是它的右子樹的最左子結點。也就是說從右子結點出發一直沿著指向左子樹結點的指標,我們就能找到它的下一個結點。例如,圖中結點b的下一個結點是h,結點a的下一個結點是f。
-
接著我們分析一下結點沒有右子樹的情形。如果結點是它父結點的左子結點,那麼它的下一個結點就是它的父結點。例如,途中結點d的父節點(next)是b,f的父節點(next)是c。
-
如果一個結點既沒有右子樹,並且它還是父結點的右子結點,我們可以沿著指向父結點的指標一直向上遍歷,直到找到一個是它父結點的左子結點的結點。
如果這樣的結點存在,那麼這個結點的父結點就是我們要找的下一個結點。
例如,為了找到結點g的下一個結點,我們沿著指向父結點的指標向上遍歷,先到達結點c。由於結點c是父結點a的右結點,我們繼續向上遍歷到達結點a。由於結點a是樹的根結點。它沒有父結點。因此結點g沒有下一個結點。
# -*- coding:utf-8 -*-
# class TreeLinkNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
# self.next = None
class Solution:
def GetNext(self, pNode):
# write code here
if not pNode:
return None
if not pNode.left and not pNode.right and not pNode.next:
return None
# 如果一個結點有右子樹,那麼它的下一個結點就是它的右子樹的最左子結點
if pNode.right:
pNode = pNode.right
while pNode.left:
pNode = pNode.left
return pNode
# 如果沒有右孩子但是有父節點
while pNode.next:
father = pNode.next
if father.left == pNode: # 若該節點是其父節點的左孩子
return father # 則下一節點就為父節點
pNode = father # 若該節點是其父節點的右孩子,找父節點的父節點,若到根節點(再無父節點了),退出迴圈,返回None
return None
# 若該節點是其父節點的右孩子,找父節點的父節點,若到根節點(再無父節點了),退出迴圈,返回None
https://cuijiahua.com/blog/2018/01/basis_57.html
https://blog.csdn.net/u014568072/article/details/87910843
相關文章
- 《劍指offer》:[58]二叉樹的下一個結點二叉樹
- 劍指offer 面試題 7 :二叉樹的下一個節點是什麼?面試題二叉樹
- 劍指offer——重建二叉樹二叉樹
- 【劍指offer】二叉樹深度二叉樹
- 劍指offer(四)重建二叉樹二叉樹
- 【劍指offer】樹的子結構
- 劍指Offer-40-二叉樹的深度二叉樹
- 劍指offer——二叉樹的映象C++二叉樹C++
- 【劍指offer】27. 二叉樹的映象二叉樹
- 劍指offer——二叉樹的深度C++二叉樹C++
- 《劍指offer》:[59]對稱的二叉樹二叉樹
- 《劍指offer》:[39]求解二叉樹的深度二叉樹
- 劍指 Offer 07. 重建二叉樹二叉樹
- 【劍指offer】判斷二叉樹平衡二叉樹
- 《劍指offer》之在完全二叉樹中新增子節點二叉樹
- 劍指offer | 55 - I. 二叉樹的深度二叉樹
- [劍指offer] 把二叉樹列印成多行二叉樹
- 《劍指offer》:[62]序列化二叉樹二叉樹
- 【劍指offer】5.二叉樹的映象和列印二叉樹
- 力扣 - 劍指 Offer 27. 二叉樹的映象力扣二叉樹
- 劍指offer-17:樹的子結構
- 劍指offer面試18 樹的子結構面試
- 《劍指offer》:[60]把二叉樹列印成多行二叉樹
- 【劍指offer】從上向下列印二叉樹二叉樹
- (python版)《劍指Offer》JZ24:二叉樹中和為某一值的路徑Python二叉樹
- # 劍指 Offer 68 - II. 二叉樹的最近公共祖先二叉樹
- 劍指offer(C++)——把二叉樹列印成多行C++二叉樹
- 【劍指offer】【4】根據前序和中序結果,重建二叉樹二叉樹
- 【劍指offer】二叉樹中和為某一值的路徑二叉樹
- 劍指offer--把二叉樹列印成多行(C++)二叉樹C++
- 劍指offer——從上往下列印二叉樹C++二叉樹C++
- 《劍指offer》:[61]按之字形順序列印二叉樹二叉樹
- 每日一題 - 劍指 Offer 54. 二叉搜尋樹的第k大節點每日一題
- 劍指offer-JavaScript版JavaScript
- 劍指offer——兩個連結串列的第一個公共結點C++C++
- 劍指 Offer 32 - III. 從上到下列印二叉樹 III二叉樹
- 《劍指offer》:[39-1]判斷是否為平衡二叉樹二叉樹
- 劍指 Offer 34. 二叉樹中和為某一值的路徑二叉樹