題目描述
給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指針。
思路解析
本道題是求所傳節點中序遍歷的下一個結點,我們就需要直到中序遍歷的規則“左子樹—>根節點—>右子樹”,我們先看一個二叉樹的中序遍歷。
由上圖我們可以知道,根據中序遍歷我們想要知道所傳節點的下一個節點的情況有兩種:
- 所傳節點有右子樹,找到其右子樹的最左下節點。
- 所傳節點沒有右子樹
a. 找到第一個當前節點是父親節點左孩子的節點。
b. 特殊情況,找到根節點還沒有找到a中所描述的節點,該節點一般是最後中序遍歷的最後一個節點,返回爲null。
代碼
/*
public class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode next = null;
TreeLinkNode(int val) {
this.val = val;
}
}
*/
import java.util.*;
public class Solution {
public TreeLinkNode GetNext(TreeLinkNode pNode)
{
if(pNode == null)
return null;
TreeLinkNode cur = pNode;
// 1. 如果pNode有右子樹,找齊右子樹的最左下孩子,將其指向
if(pNode.right != null){
cur = pNode.right;
while(cur.left != null){
cur = cur.left;
}
return cur;
}
// 2. 如果pNode沒有右子樹,需要找當前節點爲父親節點左孩子的節點
else{
while(cur.next != null){
if(cur.next.left == cur)
return cur.next;
cur = cur.next;
}
// 走到這裏,所傳節點爲中序遍歷的最後一個節點
return null;
}
}
}