劍指Offer-二叉樹的下一個結點
阿新 • • 發佈:2018-03-31
next 子節點 this link pre gpo 思路 返回 二叉樹遍歷
題目描述
給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。註意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指針。
思路
分析二叉樹的下一個節點,一共有以下情況:
- 二叉樹為空,則返回空;
- 節點右孩子存在,則指針從該節點的右孩子出發,一直沿著指向左子結點的指針找到的葉子節點即為下一個節點;
- 節點不是根節點。如果該節點是其父節點的左孩子,則返回父節點;否則繼續向上遍歷其父節點的父節點,重復之前的判斷,返回結果。
中序遍歷(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-二叉樹的下一個結點