劍指Offer(面試題8-1)——二叉樹的下一個節點

劍指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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章