1. 程式人生 > >劍指Offer-二叉樹的下一個結點

劍指Offer-二叉樹的下一個結點

next 子節點 this link pre gpo 思路 返回 二叉樹遍歷

題目描述

給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。註意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指針。

思路

分析二叉樹的下一個節點,一共有以下情況:

  1. 二叉樹為空,則返回空;
  2. 節點右孩子存在,則指針從該節點的右孩子出發,一直沿著指向左子結點的指針找到的葉子節點即為下一個節點;
  3. 節點不是根節點。如果該節點是其父節點的左孩子,則返回父節點;否則繼續向上遍歷其父節點的父節點,重復之前的判斷,返回結果。

中序遍歷(LDR)是二叉樹遍歷的一種,也叫做中根遍歷、中序周遊。在二叉樹中,先左後根再右。巧記:左根右。

代碼實現

package Tree;

/**
* 二叉樹的下一個結點 * 給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。 * 註意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指針。 */ public class Solution32 { public TreeLinkNode GetNext(TreeLinkNode pNode) { //二叉樹為空 if (pNode == null) return null; //若有右孩子,則找右孩子的最左節點 if (pNode.right != null) { pNode = pNode.right
; while (pNode.left != null) { pNode = pNode.left; } return pNode; } //該節點不是根節點,若該節點是其父節點的左孩子,則返回父節點;否則繼續向上遍歷其父節點的父節點,重復之前的判斷,返回結果。 while (pNode.next != null) { if (pNode.next.left == pNode) return pNode.next
; pNode = pNode.next; } return null; } public class TreeLinkNode { int val; TreeLinkNode left = null; TreeLinkNode right = null; TreeLinkNode next = null; TreeLinkNode(int val) { this.val = val; } } }

劍指Offer-二叉樹的下一個結點