(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 面試題 7 :二叉樹的下一個節點是什麼?面試題二叉樹
- 劍指offer——重建二叉樹二叉樹
- 劍指offer(四)重建二叉樹二叉樹
- 劍指Offer-40-二叉樹的深度二叉樹
- 劍指offer——二叉樹的深度C++二叉樹C++
- 【劍指offer】27. 二叉樹的映象二叉樹
- 劍指offer——二叉樹的映象C++二叉樹C++
- 劍指 Offer 07. 重建二叉樹二叉樹
- 《劍指offer》之在完全二叉樹中新增子節點二叉樹
- 劍指offer | 55 - I. 二叉樹的深度二叉樹
- [劍指offer] 把二叉樹列印成多行二叉樹
- (python版)《劍指Offer》JZ24:二叉樹中和為某一值的路徑Python二叉樹
- 【劍指offer】5.二叉樹的映象和列印二叉樹
- 力扣 - 劍指 Offer 27. 二叉樹的映象力扣二叉樹
- 劍指offer-17:樹的子結構
- 劍指 Offer 54. 二叉搜尋樹的第k大節點 mark
- # 劍指 Offer 68 - II. 二叉樹的最近公共祖先二叉樹
- 【劍指offer】【4】根據前序和中序結果,重建二叉樹二叉樹
- 力扣 - 劍指 Offer 54. 二叉搜尋樹的第k大節點力扣
- [劍指offer] 二叉搜尋樹的後序遍歷序列
- leetcode 102 劍指Offer 32 二叉樹的層次遍歷LeetCode二叉樹
- 劍指offer:給定一棵二叉搜尋樹,請找出其中的第k小的結點。
- 劍指offer——兩個連結串列的第一個公共結點C++C++
- 劍指offer——連結串列中倒數第k個結點
- 劍指offer--把二叉樹列印成多行(C++)二叉樹C++
- 劍指offer——從上往下列印二叉樹C++二叉樹C++
- 每日一題 - 劍指 Offer 54. 二叉搜尋樹的第k大節點每日一題
- 劍指 Offer 32 - III. 從上到下列印二叉樹 III二叉樹
- 劍指offer-JavaScript版JavaScript
- 008,二叉樹的下一個節點二叉樹
- 劍指 Offer 33. 二叉搜尋樹的後序遍歷序列
- 劍指 Offer 34. 二叉樹中和為某一值的路徑二叉樹
- 劍指Offer-38-兩個連結串列的第一個公共節點
- LeetCode 劍指offer——從上到下列印二叉樹 II、從上到下列印二叉樹 IIILeetCode二叉樹
- 劍指offer:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。二叉樹
- 演算法題(三十五):二叉樹的下一個結點演算法二叉樹
- 劍指offer(java實現)第4題“重建二叉樹”-牛客網Java二叉樹
- 劍指 Offer 32 - I. 從上到下列印二叉樹(java解題)二叉樹Java