劍指Offer(面試題8-1)
題目
給定一棵二叉樹的其中一個節點,請找出中序遍歷序列的下一個節點。
注意:
- 如果給定的節點是中序遍歷序列的最後一個,則返回空節點;
- 二叉樹一定不爲空,且給定的節點一定不是空節點;
樣例
假定二叉樹是:[2, 1, 3, null, null, null, null], 給出的是值等於2的節點。
則應返回值等於3的節點。
解釋:該二叉樹的結構如下,2的後繼節點是3。
2
/ \
1 3
思路
拿到這道題,我們要先了解什麼是二叉樹的中序遍歷,中序遍歷指的是以左、根、右的順序對二叉樹進行遍歷,例如中序遍歷爲[4, 2, 5, 1, 6, 7, 3]
的二叉樹,它的形狀是這樣的
1
/ \
2 3
/ \ /
4 5 6
\
7
如果我們想得到某個節點在中序遍歷中的下一個節點,我們就需要留意存在多少種情況,以上面的二叉樹爲例,有一下情況:
- 2:節點
2
是一個存在右子樹的節點,如果一個節點存在右子樹,那麼它在中序遍歷中的下一個節點就是node.right.left.left......left
,就是它右子樹的最深的左子樹 - 3:節點
3
不存在右子樹,這時我們要關注它是它父親節點的哪一個孩子,顯然3
是右孩子,那就說明它的下一節點要麼是它父親的父親,例如5
,要麼爲null
- 4:與上一種情況相反,
4
雖然沒有右孩子,但是它是它父親節點的左孩子,那它的下一節點就是它的父親節點
到這裏,我們可以根據這幾種情況,通過代碼來找到下一節點
代碼
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode father;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode inorderSuccessor(TreeNode p) {
if (p.right != null) {
p = p.right;
while (p.left != null) p = p.left;
return p;
}
if (p.father != null && p.father.right == p) return p.right;
else if (p.father != null && p.father.left == p) return p.father;
else
return p.father;
}
}